Objetivo y Anotaciones [Etapa 1]

En términos generales, esta primera etapa de estudio mostrará cálculos, visualizaciones e interpretaciones con base en un conjunto de datos desde un enfoque de estadística descriptiva multivariante; además, de incluir una prueba estadística de normalidad multivariada sobre ellos.

El conjunto de datos de trabajo es descrito en la sección 2. Cabe anotar que los fundamentos teóricos provienen de notas de clase del curso Análisis Multivariante dictado por el profesor Juan Carlos Rubriche Cárdenas para la Especialización en Estadística Aplicada, modalidad virtual (cohorte 2022-4), de la Fundación Universitaria Los Libertadores; y de los libros: Análisis Multivariante Aplicado con R (Aldás & Uriel, 2017) de Joaquín Aldás y Ezequiel Uriel, Análisis Multivariante de Joseph Hair, Rolph Anderson, Ronald Tatham y William Black (Hair et al., 1999), Análisis Estadístico de Datos Multivariados de Luis Guillermo Díaz Monroy y Mario Alfonso Morales Rivera (Díaz Morales & Morales Rivera, 2012), Introducción a la Teoría Matemática de las Probabilidades y a la Estadística de Howard Tucker (Tucker, 1973) y Análisis Multivariado: Estadística Multivariada Descriptiva de William David Aristizábal Rodríguez (Aristizábal R., 2017).

Este trabajo continúa el hecho en el curso Análisis de Regresión dictado por el profesor Dagoberto Bermúdez para la Especialización en Estadística Aplicada, modalidad virtual (cohorte 2022-4), de la Fundación Universitaria Los Libertadores. En este la bibliografía consultada fue: probabilidad y estadística de Jay L. Devore (Devore, Jay L., 2008), Bioestadística de Wayne W. Daniel (Daniel, Wayne W., 2013), Métodos Matemáticos de Estadística de Harald Cramer (Cramer, Harald, 1953); motivo por el cual se incluyen en las referencias. El trabajo hecho en Análisis de Regresión que puede ser consultado temporalmente a través de: https://rpubs.com/glibrerosl/Applied-Statistics-FULL.

Por último, este trabajo fue procesado con R version 4.2.2 (2022-10-31 ucrt) mediado por RStudio 2022.12.0 Build 353 en una plataforma x86_64-w64-mingw32. Además, por su naturaleza de publicación en línea y para cumplir con el requisito temporal de entrega, será actualizado, como máximo, hasta las 11:59 p.m. del lunes 13 de febrero de 2023.

2. Descripción de los Datos

2.1. Fuente del Conjunto de Datos

El conjunto de datos de trabajo se obtuvo casi totalmente de Kaggle: https://www.kaggle.com/akshaydattatraykhare. Es conveniente anotar que Kaggle es una compañía subsidiaria de Google LLC que mantiene una comunidad online de científicos de datos y profesionales del aprendizaje automático. Esta empresa permite a sus usuarios encontrar y publicar conjuntos de datos, explorar y crear modelos en un entorno de ciencia de datos basado en la web, trabajar con otros científicos de datos e ingenieros de aprendizaje automático y participar en concursos para resolver desafíos de ciencia de datos.

2.2. Contexto del Conjunto de Datos

El conjunto de datos incluye métricas académicas obtenidas por estudiantes extranjeros para aspirar a acceder a universidades de EE.UU. Este conjunto de datos se actualizó por última vez en julio de 2022.

2.3. Descripción del Conjunto de Datos

El conjunto de datos contiene 10 campos y 400 registros. Uno de los campos es simplemente un identificador numérico secuencial de los registros; otros tres son de naturaleza politómica; y el resto son numéricos estrictamente positivos. La lista siguiente los describe en el mismo orden, de izquierdda a derecha, como aparecen en el rango de datos que los contiene y se establece para cada campo, excepto el campo Serial, el tipo de variable y su escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medición[ordenamiento]):

  • Serial (identificador): registra un número secuenciado a partir de 1 para identificar de forma única cada registro consignado en el conjunto de datos.

  • Gender (cualitativa::nominal): registra el sexo del estudiante del cual se registraron los datos: 1 corresponde con un estudiante de sexo masculino, 0 con un estudiante de sexo femenino.

  • GRE Score (cuantitativa::razón): registra el puntaje total GRE (examen de acceso a la universidad) obtenido por el estudiante. GRE es un componente común del proceso de admisión a colegios o universidades en EE.UU. que mide el razonamiento verbal, cuantitativo, la escritura analítica y las habilidades de pensamiento crítico que se han adquirido a lo largo de un extenso período de tiempo y que no están relacionados con campo específicos de estudio. El campo solo registra dos de los tres componentes de la evaluación: razonamiento verbal y cuantitativo, en una escala desde 260 hasta 340 puntos. El resultado ausente del puntaje corresponde con el componente de escritura analítica: calificado entre 0 y 6 puntos.

  • TOEFL Score (cuantitativa::razón): registra el puntaje total TOEFL (prueba de inglés como idioma extranjero) obtenido por el estudiante. TOEFL es un componente común del proceso de admisión a colegios o universidades en EE.UU. por parte de estudiantes extranjeros que mide las competencias en comprensión escrita, comprensión oral, expresión oral y expresión escrita, en una escala desde 0 hasta 120 puntos.

  • SOP (cuantitativa::razón): registra el puntaje total SOP (ensayo de declaración de propósitos o de admisión) obtenido por el estudiante. SOP es un componente común del proceso de admisión a colegios o universidades en EE.UU. que consiste en un ensayo de solicitud de ingreso escrito por el estudiante en el cual debe hacer una descripción general de quién es, en quién quiere convertirse y hasta qué punto está preparado para seguir un determinado curso en la institución educativa a la cual aspira ingresar. Este ensayo se califica con un puntaje entre 0 y 5.

  • LOR (cuantitativa::razón): registra el puntaje total LOR (carta de recomendación) obtenido por el estudiante. LOR es un componente común del proceso de admisión a colegios o universidades en EE.UU. que consiste en una recomendación escrita, generalmente por un profesor, en la cual el redactor evalúa las cualidades, características y capacidades del estudiante recomendado en relación con su aptitud para seguir un curso en la institución educativa a la cual el estudiante aspira a ingresar. Esta carta se califica con un puntaje entre 0 y 5.

  • CGPA (cuantitativa::razón): registra el puntaje total CGPA (promedio de calificaciones acumulativo) obtenido por el estudiante. CGPA es un componente común del proceso de admisión a colegios o universidades en EE.UU. que mide el desempeño promedio del estudiante en su escolaridad previa a la solicitud de ingreso a la institución educativa siguiente de su preferencia. Este puntaje se mide entre 0 y 4; sin embargo, en el conjunto de datos fue convertido en una escala entre 0 y 10.

  • Research (cualitativa::nominal): registra la experiencia en investigación que posee el estudiante: 1 corresponde con que el estudiante argumenta experiencia investigativa, 0 corresponde con que no-argumenta experiencia investigativa.

  • University Rating (cualitativa::nominal(ordenada)): registra valoración de la universidad a la cual aspira a ingresar el estudiante. Esta valoración se hace en una escala entre 1 y 5 estrellas, cinco estrellas indica la mejor valoración.

  • Chance of Admit (cuantitativa::razón): registra la probabilidad de que el estudiante sea admitido en la universidad de su preferencia con base en los datos registrados a su nombre, salvo su sexo. Esta probrabilidad se mide entre 0 y 1.

Por último, es necesario aclarar que en el conjunto de datos los registros de las variables cualitativas fueron reescritos, según los casos, por números enteros positivos, incluido el cero. Así, los sexos en la variable Gender fueron reescritos como 0:female y 1:male; en Research el evidenciar o no-evidenciar investigaciones fue reescrito como 0:no-research y 1:research; y en University Rating la valoración de la universidad fue reescrita como 1:one_star, 2:two_stars, 3:three_stars, 4:four_stars y 5:five_stars.

Estructura del Conjunto de Datos Inicial

str(Admission_Dataset_Initial)
## tibble [400 × 10] (S3: tbl_df/tbl/data.frame)
##  $ Serial           : num [1:400] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Gender           : chr [1:400] "M" "F" "M" "M" ...
##  $ GRE_Score        : num [1:400] 337 324 316 322 314 330 321 308 302 323 ...
##  $ TOEFL_Score      : num [1:400] 118 107 104 110 103 115 109 101 102 108 ...
##  $ SOP              : num [1:400] 4.5 4 3 3.5 2 4.5 3 3 2 3.5 ...
##  $ LOR              : num [1:400] 4.5 4.5 3.5 2.5 3 3 4 4 1.5 3 ...
##  $ CGPA             : num [1:400] 9.65 8.87 8 8.67 8.21 9.34 8.2 7.9 8 8.6 ...
##  $ Research         : chr [1:400] "research" "research" "research" "research" ...
##  $ University_Rating: chr [1:400] "four_stars" "four_stars" "three_stars" "three_stars" ...
##  $ Chance_of_Admit  : num [1:400] 0.92 0.76 0.72 0.8 0.65 0.9 0.75 0.68 0.5 0.45 ...

Conjunto de Datos Inicial

Admission_Dataset_Initial
## # A tibble: 400 × 10
##    Serial Gender GRE_Score TOEFL_Score   SOP   LOR  CGPA Resea…¹ Unive…² Chanc…³
##     <dbl> <chr>      <dbl>       <dbl> <dbl> <dbl> <dbl> <chr>   <chr>     <dbl>
##  1      1 M            337         118   4.5   4.5  9.65 resear… four_s…    0.92
##  2      2 F            324         107   4     4.5  8.87 resear… four_s…    0.76
##  3      3 M            316         104   3     3.5  8    resear… three_…    0.72
##  4      4 M            322         110   3.5   2.5  8.67 resear… three_…    0.8 
##  5      5 M            314         103   2     3    8.21 no-res… two_st…    0.65
##  6      6 M            330         115   4.5   3    9.34 resear… five_s…    0.9 
##  7      7 M            321         109   3     4    8.2  resear… three_…    0.75
##  8      8 M            308         101   3     4    7.9  no-res… two_st…    0.68
##  9      9 F            302         102   2     1.5  8    no-res… one_st…    0.5 
## 10     10 F            323         108   3.5   3    8.6  no-res… three_…    0.45
## # … with 390 more rows, and abbreviated variable names ¹​Research,
## #   ²​University_Rating, ³​Chance_of_Admit

Estructura del Conjunto de Datos Reescrito

str(Admission_Dataset)
## tibble [400 × 10] (S3: tbl_df/tbl/data.frame)
##  $ Serial           : num [1:400] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Gender           : num [1:400] 1 0 1 1 1 1 1 1 0 0 ...
##  $ GRE_Score        : num [1:400] 337 324 316 322 314 330 321 308 302 323 ...
##  $ TOEFL_Score      : num [1:400] 118 107 104 110 103 115 109 101 102 108 ...
##  $ SOP              : num [1:400] 4.5 4 3 3.5 2 4.5 3 3 2 3.5 ...
##  $ LOR              : num [1:400] 4.5 4.5 3.5 2.5 3 3 4 4 1.5 3 ...
##  $ CGPA             : num [1:400] 9.65 8.87 8 8.67 8.21 9.34 8.2 7.9 8 8.6 ...
##  $ Research         : num [1:400] 1 1 1 1 0 1 1 0 0 0 ...
##  $ University_Rating: num [1:400] 4 4 3 3 2 5 3 2 1 3 ...
##  $ Chance_of_Admit  : num [1:400] 0.92 0.76 0.72 0.8 0.65 0.9 0.75 0.68 0.5 0.45 ...

Conjunto de Datos Reescrito

Admission_Dataset
## # A tibble: 400 × 10
##    Serial Gender GRE_Score TOEFL_Score   SOP   LOR  CGPA Resea…¹ Unive…² Chanc…³
##     <dbl>  <dbl>     <dbl>       <dbl> <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>
##  1      1      1       337         118   4.5   4.5  9.65       1       4    0.92
##  2      2      0       324         107   4     4.5  8.87       1       4    0.76
##  3      3      1       316         104   3     3.5  8          1       3    0.72
##  4      4      1       322         110   3.5   2.5  8.67       1       3    0.8 
##  5      5      1       314         103   2     3    8.21       0       2    0.65
##  6      6      1       330         115   4.5   3    9.34       1       5    0.9 
##  7      7      1       321         109   3     4    8.2        1       3    0.75
##  8      8      1       308         101   3     4    7.9        0       2    0.68
##  9      9      0       302         102   2     1.5  8          0       1    0.5 
## 10     10      0       323         108   3.5   3    8.6        0       3    0.45
## # … with 390 more rows, and abbreviated variable names ¹​Research,
## #   ²​University_Rating, ³​Chance_of_Admit

3. Estimaciones Multivariadas

Como se menciona en (Aristizábal R., 2017) la de media, varianza y covarianza conforman un conjunto de medidas fundamentales para describir describir el comportamiento posicional, dispersivo y correlacional de variables aleatorias. En este sentido, el conjunto de datos de trabajo que posee cinco variables aleatorias numéricas, y que está representado matricialmente, estima las medidas anteriores a partir de vectores y matrices en el estudio descriptivo multivariable.

El vector de medias indica el comportamiento posicional en el sentido de valor esperado o punto medio para cada variable en relación con todos sus registros. La matriz de varianzas-covarianzas estima las dispersiones, en su diagonal principal, de cada variable del conjunto de datos respecto de cada media obtenida del vector de medias. Además, por encima o por debajo de la diagonal principal, se estiman las covarianzas entre las combinaciones de los posibles pares de variables del conjunto de datos. Para más detalles se puede consultar a (Aristizábal R., 2017).

Lo anterior, para el conjunto de datos de trabajo, se desarrolla en la sección 3.2.

3.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se calcularán e intepretarán, para las variables numéricas, el vector de medias, la matriz de varianzas-covarianzas y la matriz de correlaciones. Se recuerda que las variables numéricas (en escalada de medición de razón) son: GRE Score, TOEFL Score, SOP, LOR, CGPA y Chance of Admit.

3.2. Desarrollo del Análisis

La navegación a través de las pestañas muestra el cálculo de los siguientes objetos: Vector de Medias \(\bar x\), Matriz de Varianzas-Covarianzas \(S\) y Matriz de Correlaciones \(R\).

Con base en la pestaña Vector de Medias y Boxplots se puede describir que en general los datos registrados para cada una de las variables tienden a tener colas izquierdas en su distribuciones, así, las medias estimadas tienden a ser altas. Adicionalmente, en relación con la mediana, solo la variable SOP muestra un sesgo notorio en comparación con las demás. Además, todos los casos atípicos son de extremo inferior. Si se revisan los rangos de las variables estudiadas se puede constatar que las medias son altas compradas con los extremos superiores de cada rango.

Con base en la pestaña Matriz de Varianzas-Covarianzas se interpreta que, en general, y como se espera que pase, las relaciones entre las variables, estudiadas por pares, tienden a ser de proporcionalidad directa. Para el caso, se pueden observar la gráfica multivariada mostrada en la pestaña Diagrama Conjunto de Dispersión, Distribución y Correlaciones [SA] de la sección 4.2.

Con base en la pestaña Matriz de Correlaciones y al considerar la Matriz de Varianzas-Covarianzas es verificable que la intensidad de las corelaciones es más alta y siempre positiva entre las variables: TOEFL_Score, GRE_Score, CGPA y Chance_of_Admit, que es esperado en relación con el fenómeno estudiado, esto se puede revisar con más detalles en la sección 4.2.

Vector de Medias y Boxplots

apply(Admission_Dataset[,-c(1,2,8,9)], 2, mean)
##       GRE_Score     TOEFL_Score             SOP             LOR            CGPA 
##      316.807500      107.410000        3.400000        3.452500        8.598925 
## Chance_of_Admit 
##        0.724350
Admission_Dataset_Reducido = Admission_Dataset[,-c(1,2,8,9)]
par(mfrow = c(1, ncol(Admission_Dataset_Reducido)))
invisible(lapply(1:ncol(Admission_Dataset_Reducido), function(i) boxplot(Admission_Dataset_Reducido[, i])))

Matriz de Varianzas-Covarianzas

round(cov(Admission_Dataset[,-c(1,2,8,9)]),2)
##                 GRE_Score TOEFL_Score  SOP  LOR CGPA Chance_of_Admit
## GRE_Score          131.64       58.22 7.08 5.75 5.70            1.31
## TOEFL_Score         58.22       36.84 4.02 3.10 3.00            0.69
## SOP                  7.08        4.02 1.01 0.66 0.43            0.10
## LOR                  5.75        3.10 0.66 0.81 0.36            0.09
## CGPA                 5.70        3.00 0.43 0.36 0.36            0.07
## Chance_of_Admit      1.31        0.69 0.10 0.09 0.07            0.02

Matriz de Correlaciones

round(cor(Admission_Dataset[,-c(1,2,8,9)]),2)
##                 GRE_Score TOEFL_Score  SOP  LOR CGPA Chance_of_Admit
## GRE_Score            1.00        0.84 0.61 0.56 0.83            0.80
## TOEFL_Score          0.84        1.00 0.66 0.57 0.83            0.79
## SOP                  0.61        0.66 1.00 0.73 0.72            0.68
## LOR                  0.56        0.57 0.73 1.00 0.67            0.67
## CGPA                 0.83        0.83 0.72 0.67 1.00            0.87
## Chance_of_Admit      0.80        0.79 0.68 0.67 0.87            1.00

4. Gráficas Multivariadas

En la guía de clase de (Aristizábal R., 2017) se menciona que, en general, los gráficos multivariados cumplen dos objetivos esenciales: primero, ayudan a comparar el comportamiento de poblaciones de estudio con base en variables categóricas y suavizan la comprensión de la estructura de correlación entre varias variables. En este sentido, el conjunto de datos de trabajo tendrá apoyo descritivo gráfico a través de tres diagramas: uno conjunto que integra dispersión, distribución y correlaciones; otro basado en la renderización de polígonos, y por último, uno que recurre a las caras de Chernoff.

4.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se calcularán e intepretarán, para las variables numéricas, las gráficas multivariadas de diagrama de correlaciones, matriz de diagrama de dispersión, diagrama de estrellas y caras de Chernoff. Se recuerda que las variables numéricas (en escalada de medición de razón) son: GRE Score, TOEFL Score, SOP, LOR, CGPA y Chance of Admit.

4.2. Desarrollo del Análisis

La navegación a través de las pestañas muestra las gráficas multivariadas de: Diagrama Conjunto de Dispersión, Distribución y Correlaciones (sin agrupación SA y con agrupación CA (con base en las tres variables categóricas: Gender:GE, Research:RE, University_Rating:UR)), Diagrama de Estrellas y Caras de Chernoff.

Con base en la pestaña Diagrama Conjunto de Dispersión, Distribución y Correlaciones [SA] se puede describir que las correlaciones más altas, mayores que \(0.8\), se dan entre variables esperadas como: TOEFL_Score, GRE_Score, CGPA y Chance_of_Admit. Estas variables, según las definiciones dadas en la sección 2 de descripción de datos, son nucleares en el fenómeno estudiado, porque están involucradas con el historial de rendimiento académico del estudiante, su desempeño en la prueba de ingreso a la universidad, su nivel de dominio certificado del idioma inglés y sus índice de probabilidad de ingreso a la universidad a la cual aspira. Sin embargo, ninguna de ellas es descollantemente explicativa. Para más detalles puede consultarse el trabajo de análisis de regrresión formulado sobre el mismo conjunto de datos a través de: https://rpubs.com/glibrerosl/Applied-Statistics-FULL.

Complementariamente, con base en las pestañas Diagrama Conjunto de Dispersión, Distribución y Correlaciones en sus versiones basadas en grupos a partir de las variables categóricas: Gender, Research y University_Rating, se puede apreciar que comparativamente la diferenciación basada en Gender no muestra relevancia para elevar la probabilidad de acceso a la universidad de su elección, contrario a lo que sucede con la variable agrupadora Research que muestra diferenciadamente lo contrario. Es decir, que un estudiante pertenezca al grupo de aquellos que evidencia trabajo en investigación al momento de presentar su solicitud de acceso, resulta para él en una característica significativamente a favor de sus pretensiones. Por otro lado, la variable clasificadora University_Rating, que aporta cinco grupos, muestra que las universidades de dos y cuatro estrellas en todos los casos visualizados en el diagrama son significativas a nivel de correlación, pero, como es esperado, las de mejor rating, atraen a los mejores talentos.

Con base en la pestaña Diagrama de Estrellas se interpreta que hay una variedad notoria de estudiantes en términos de desempeños asociados con las variables numéricas estudiadas, incluso con la que mide el examen de proficiencia en lengua extranjera, para el caso inglés: TOEFL_Score. Pero, también es notoria la presencia de grupos de estudiantes con desempeños aproximadamente homogéneos en todas las variables estudiadas, aunque sus escalas de desempeño varian.

Complementariamente a los diagramas de estrellas, la pestaña Caras de Chernoff muestra que la variedad de estudiantes es sensible de establecer. Con relativa claridad, las Caras de Chernoff número 1, 10, 21 y 8, 19, 22, pueden conformar un par de grupos de estudiantes que muestran desempeños significativos en las variables medidas, aunque con cambios de escala; es decir, los del segundo grupo se desempeñan mejor que los del primero considerando todas las variables estudiadas. Esto compagina con lo mostrado en el Diagrama de Estrellas.

Por último, es relevante mencionar que las evidencias descriptivas expuestas en este apartado estén en contra de considerar que el conjunto de datos limitado a las variables numéricas tenga una distribución normal multivariada. Esto se estudia en la sección 5.

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [SA]

ggpairs(Admission_Dataset[,-c(1,2,8,9)])

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [CA:GE]

ggpairs(Admission_Dataset_Initial, columns = c(3:7,10), aes(color = Gender, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [CA:RE]

ggpairs(Admission_Dataset_Initial, columns = c(3:7,10), aes(color = Research, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [CA:UR]

ggpairs(Admission_Dataset_Initial, columns = c(3:7,10), aes(color = University_Rating, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas

set.seed(780728)
Admission_Dataset_Muestreado = Admission_Dataset[sample(1:nrow(Admission_Dataset),23),-c(1,2,8,9)]
stars(Admission_Dataset_Muestreado, len = 1, cex = 0.4, key.loc = c(10, 2), draw.segments = TRUE)

Caras de Chernoff

set.seed(780728)
Admission_Dataset_Muestreado = Admission_Dataset[sample(1:nrow(Admission_Dataset),23),-c(1,2,8,9)]
faces(Admission_Dataset_Muestreado)

## effect of variables:
##  modified item       Var              
##  "height of face   " "GRE_Score"      
##  "width of face    " "TOEFL_Score"    
##  "structure of face" "SOP"            
##  "height of mouth  " "LOR"            
##  "width of mouth   " "CGPA"           
##  "smiling          " "Chance_of_Admit"
##  "height of eyes   " "GRE_Score"      
##  "width of eyes    " "TOEFL_Score"    
##  "height of hair   " "SOP"            
##  "width of hair   "  "LOR"            
##  "style of hair   "  "CGPA"           
##  "height of nose  "  "Chance_of_Admit"
##  "width of nose   "  "GRE_Score"      
##  "width of ear    "  "TOEFL_Score"    
##  "height of ear   "  "SOP"

5. Normalidad Multivariada

Como menciona (Porras C., 2016) para indagar o establecer el tipo de distribución multivariada de un conjunto de datos se puede recurrir a procedimientos descriptivos, como los gráficos, o a procedimientos inferenciales, como las pruebas estadísticas. En este sentido, se alcanza generalización de resultados al usar las estos últimos, si bien los primeros apoyan a las interpretaciones.

En este apartado se contempla el uso de procedimientos inferenciales para determinar si el conjunto de datos de trabajo, en relación con sus variables numéricas, se distribuye normal multivariado (DNM). Las pruebas de normalidad multivariada (PNM) a las que será sometido son: Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Para estas pruebas de normalidad los test obedecen a un nivel de significancia \(\alpha = 0.05\) y a las hipótesis:\[H_0: \text {Las variables tienen una DNM}\] \[H_1: \text {Las variables NO tienen una DNM}\]

La prueba de Mardia se basa en extensiones de asimetría y curtosis, el cuadrado de la distancia de Mahalanobis, la cantidad de variables \(p\) por tratar y la cantidad de registros \(n\). Además, considera que la prueba estadística para la asimetría tiene una distribución \(\chi^2\) y la prueba estadística para la curtosis se distirbuye aproximadamente normal. Los detalles sobre los parámetros de las distribuciones pueden consultarse en el trabajo de (Porras C., 2016).

La prueba de Henze-Zirkler se basa en la distancia funcional, dado que si el conjunto de datos presenta una distribución normal multivariada, el estadístico de la prueba se distribuye aproximadamente como una lognormal, cuyos parámetros de media \(\mu\) y varianza \(\sigma^2\) pueden ser consultados en (Porras C., 2016).

La prueba de Doornik-Hansen está basada en la asimetría y la curtosis de un conjunto de datos multivariados, que se transforma para garantizar la independencia. Es considerada más potente que la prueba de Shapiro-Wilk para casos multivariados. Su estadístico de prueba está definido como la suma de las transformaciones al cuadrado de la asimetría y la curtosis, y sigue, aproximadamente, una distribución \(\chi^2\). Los detalles de la prueba pueden ser consultados en (Doornik & Hansen, 2008).

La prueba de Royston recurre a las pruebas Shapiro-Wilk o Shapiro-Francia para probar la normalidad multivariada. Así, si la curtosis es mayor que 3, la prueba de Royston usa Shapiro-Francia para distribuciones leptocurticas. Mientras que para distribuciones platicurticas usa Shapiro-Wilk. En ella los parámetros son obtenidos por aproximaciones polinomiales, esto puede ser consultado en (Porras C., 2016).

5.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se hará una prueba estadística de normalidad multivariada, con un nivel de significancia \(\alpha=0.05\), para establecer si sus datos métricos provienen de una población normal multivariada. Se recuerda que las variables numéricas del conjunto de datos (en escalada de medición de razón) son: GRE Score, TOEFL Score, SOP, LOR, CGPA y Chance of Admit.

5.2. Desarrollo del Análisis

La navegación a través de las pestañas muestra que el conjunto de datos, en relación con sus variables numéricas, no se distribuye normal multivariado. En particular:

La PNM de Mardia establece que si ambas pruebas (para asimetría y curtosis) indican una normalidad multivariante, los datos siguen una DNM con un nivel de significancia \(\alpha=0.05\); sin embargo, el caso tratado es contrario a esto. Obsérvese a través de la pestaña PNM Mardia que los \(p-value\) para la asimetría (Skewness) y curtoris (Kurtosis) son mayores que el nivel de significancia. Por lo tanto, las evidencias no apoyan una hipótesis de normalidad multivariada para el conjunto de datos restringido a sus variables numéricas.

La PNM de PNM Henze-Zirkler establece que el estadístico de prueba no se distribuye aproximadamente como lognormal dado que su \(p-value\) es menor que el nivel de significancia \(\alpha=0.05\), obsérvese esto a través de la pestaña PNM Henze-Zirkler. Así, por contrarrecíproco de la implicación formulada en la descripción de la prueba en la sección 5, el conjunto de datos no está apoyado por las evidencias para seguir una distribución normal multivariada.

La PNM de Doornik-Hansen establece que su estadístico de prueba no sigue una distribución aproximadamente \(\chi^2\) dado que su \(p-value\) es menor que el nivel de significancia \(\alpha=0.05\), obsérvese esto a través de la pestaña PNM Doornik-Hansen. Por lo tanto, las evidencias están lejos de apoyar que el conjunto de datos sigue una DNM.

La PNM de Royston establece que el conjunto de datos reducido a sus variables numéricas no sigue una DNM, dado que su \(p-value\) es menor que el nivel de significancia \(\alpha=0.05\). Obsérvese esto a través de la pestaña PNM Royston.

En general, pudo constatarse que para un nivel de significancia \(\alpha=0.05\) el conjunto de datos reducido a sus variabls numéricas no sigue una distribución normal multivariada.

PNM Mardia

mvn(Admission_Dataset[,-c(1,2,8,9)], mvnTest="mardia")
## $multivariateNormality
##              Test        Statistic              p value Result
## 1 Mardia Skewness 271.779505720825 4.34632487808584e-30     NO
## 2 Mardia Kurtosis 4.02256608402635 5.75674947702609e-05     NO
## 3             MVN             <NA>                 <NA>     NO
## 
## $univariateNormality
##               Test        Variable Statistic   p value Normality
## 1 Anderson-Darling    GRE_Score       1.1168  0.0063      NO    
## 2 Anderson-Darling   TOEFL_Score      1.1416  0.0055      NO    
## 3 Anderson-Darling       SOP          5.4710  <0.001      NO    
## 4 Anderson-Darling       LOR          5.9416  <0.001      NO    
## 5 Anderson-Darling      CGPA          0.5320  0.1729      YES   
## 6 Anderson-Darling Chance_of_Admit    1.5949   4e-04      NO    
## 
## $Descriptives
##                   n       Mean    Std.Dev Median    Min    Max   25th     75th
## GRE_Score       400 316.807500 11.4736461 317.00 290.00 340.00 308.00 325.0000
## TOEFL_Score     400 107.410000  6.0695138 107.00  92.00 120.00 103.00 112.0000
## SOP             400   3.400000  1.0068686   3.50   1.00   5.00   2.50   4.0000
## LOR             400   3.452500  0.8984775   3.50   1.00   5.00   3.00   4.0000
## CGPA            400   8.598925  0.5963171   8.61   6.80   9.92   8.17   9.0625
## Chance_of_Admit 400   0.724350  0.1426093   0.73   0.34   0.97   0.64   0.8300
##                        Skew   Kurtosis
## GRE_Score       -0.06242254 -0.7181786
## TOEFL_Score      0.05678751 -0.5985838
## SOP             -0.27369641 -0.6937320
## LOR             -0.10619038 -0.6808341
## CGPA            -0.06549644 -0.4803728
## Chance_of_Admit -0.35080166 -0.4122290

PNM Henze-Zirkler

mvn(Admission_Dataset[,-c(1,2,8,9)], mvnTest="hz")
## $multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 1.675143       0  NO
## 
## $univariateNormality
##               Test        Variable Statistic   p value Normality
## 1 Anderson-Darling    GRE_Score       1.1168  0.0063      NO    
## 2 Anderson-Darling   TOEFL_Score      1.1416  0.0055      NO    
## 3 Anderson-Darling       SOP          5.4710  <0.001      NO    
## 4 Anderson-Darling       LOR          5.9416  <0.001      NO    
## 5 Anderson-Darling      CGPA          0.5320  0.1729      YES   
## 6 Anderson-Darling Chance_of_Admit    1.5949   4e-04      NO    
## 
## $Descriptives
##                   n       Mean    Std.Dev Median    Min    Max   25th     75th
## GRE_Score       400 316.807500 11.4736461 317.00 290.00 340.00 308.00 325.0000
## TOEFL_Score     400 107.410000  6.0695138 107.00  92.00 120.00 103.00 112.0000
## SOP             400   3.400000  1.0068686   3.50   1.00   5.00   2.50   4.0000
## LOR             400   3.452500  0.8984775   3.50   1.00   5.00   3.00   4.0000
## CGPA            400   8.598925  0.5963171   8.61   6.80   9.92   8.17   9.0625
## Chance_of_Admit 400   0.724350  0.1426093   0.73   0.34   0.97   0.64   0.8300
##                        Skew   Kurtosis
## GRE_Score       -0.06242254 -0.7181786
## TOEFL_Score      0.05678751 -0.5985838
## SOP             -0.27369641 -0.6937320
## LOR             -0.10619038 -0.6808341
## CGPA            -0.06549644 -0.4803728
## Chance_of_Admit -0.35080166 -0.4122290

PNM Doornik-Hansen

mvn(Admission_Dataset[,-c(1,2,8,9)], mvnTest="dh")
## $multivariateNormality
##             Test        E df p value MVN
## 1 Doornik-Hansen 1844.957 12       0  NO
## 
## $univariateNormality
##               Test        Variable Statistic   p value Normality
## 1 Anderson-Darling    GRE_Score       1.1168  0.0063      NO    
## 2 Anderson-Darling   TOEFL_Score      1.1416  0.0055      NO    
## 3 Anderson-Darling       SOP          5.4710  <0.001      NO    
## 4 Anderson-Darling       LOR          5.9416  <0.001      NO    
## 5 Anderson-Darling      CGPA          0.5320  0.1729      YES   
## 6 Anderson-Darling Chance_of_Admit    1.5949   4e-04      NO    
## 
## $Descriptives
##                   n       Mean    Std.Dev Median    Min    Max   25th     75th
## GRE_Score       400 316.807500 11.4736461 317.00 290.00 340.00 308.00 325.0000
## TOEFL_Score     400 107.410000  6.0695138 107.00  92.00 120.00 103.00 112.0000
## SOP             400   3.400000  1.0068686   3.50   1.00   5.00   2.50   4.0000
## LOR             400   3.452500  0.8984775   3.50   1.00   5.00   3.00   4.0000
## CGPA            400   8.598925  0.5963171   8.61   6.80   9.92   8.17   9.0625
## Chance_of_Admit 400   0.724350  0.1426093   0.73   0.34   0.97   0.64   0.8300
##                        Skew   Kurtosis
## GRE_Score       -0.06242254 -0.7181786
## TOEFL_Score      0.05678751 -0.5985838
## SOP             -0.27369641 -0.6937320
## LOR             -0.10619038 -0.6808341
## CGPA            -0.06549644 -0.4803728
## Chance_of_Admit -0.35080166 -0.4122290

PNM Royston

mvn(Admission_Dataset[,-c(1,2,8,9)], mvnTest="royston")
## $multivariateNormality
##      Test        H      p value MVN
## 1 Royston 83.73469 4.306446e-17  NO
## 
## $univariateNormality
##               Test        Variable Statistic   p value Normality
## 1 Anderson-Darling    GRE_Score       1.1168  0.0063      NO    
## 2 Anderson-Darling   TOEFL_Score      1.1416  0.0055      NO    
## 3 Anderson-Darling       SOP          5.4710  <0.001      NO    
## 4 Anderson-Darling       LOR          5.9416  <0.001      NO    
## 5 Anderson-Darling      CGPA          0.5320  0.1729      YES   
## 6 Anderson-Darling Chance_of_Admit    1.5949   4e-04      NO    
## 
## $Descriptives
##                   n       Mean    Std.Dev Median    Min    Max   25th     75th
## GRE_Score       400 316.807500 11.4736461 317.00 290.00 340.00 308.00 325.0000
## TOEFL_Score     400 107.410000  6.0695138 107.00  92.00 120.00 103.00 112.0000
## SOP             400   3.400000  1.0068686   3.50   1.00   5.00   2.50   4.0000
## LOR             400   3.452500  0.8984775   3.50   1.00   5.00   3.00   4.0000
## CGPA            400   8.598925  0.5963171   8.61   6.80   9.92   8.17   9.0625
## Chance_of_Admit 400   0.724350  0.1426093   0.73   0.34   0.97   0.64   0.8300
##                        Skew   Kurtosis
## GRE_Score       -0.06242254 -0.7181786
## TOEFL_Score      0.05678751 -0.5985838
## SOP             -0.27369641 -0.6937320
## LOR             -0.10619038 -0.6808341
## CGPA            -0.06549644 -0.4803728
## Chance_of_Admit -0.35080166 -0.4122290

Objetivo y Anotaciones [Etapa 2]

En términos generales, esta segunda etapa de estudio mostrará cálculos, visualizaciones e interpretaciones con base el conjunto de datos tratado en la Etapa 1, pero ahora desde un enfoque de análisis de componentes principales sobre las variables cuantitativas, que incluirá: selección, calidad de representación, contribuciones e interpretación.

Recuérdese que el conjunto de datos de trabajo es descrito en la sección 2 y los referentes teóricos en la sección 1.

Por último, este trabajo fue procesado con R version 4.2.2 (2022-10-31 ucrt) mediado por RStudio 2022.12.0 Build 353 en una plataforma x86_64-w64-mingw32. Además, por su naturaleza de publicación en línea y para cumplir con el requisito temporal de entrega, será actualizado, como máximo, hasta las 11:59 p.m. del domingo 26 de febrero de 2023.

7. Selección de Componentes

Como es mencionado en el trabajo de (Díaz Morales & Morales Rivera, 2012) el Análisis de Componentes Principales (en adelante ACP) reestructura un conjunto de datos multivariado a través de la reducción de la cantidad de sus variables, en cuyo transfondo es innecesario asumir ninguna distribución de probabilidad de ellas. Esta reducción es lograda a través de combinaciones lineales de las variables originales, que deberán contener la mayor variabilidad posible presente en el conjunto de datos. En este sentido, el ACP logra crear nuevas variables, conocidas como componentes principales, que poseen características estadísticas de independencia (con base en el supuesto de normalidad) y no correlación.

El ACP se logra a lo largo de las siguientes fases: generación de nuevas variables, reducción dimensional del espacio de los datos, eliminación de varaibles de poco aporte e interpretación de los componentes resultantes en el contexto del problema del cual se obtuvieron los datos. Estas fases se desarrollan entre las secciones 7, 8, 9 y 10.

7.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se demanda primero establecer el porcentaje de varianza explicado por cada dimensión una vez procesado el ACP; y posteriormente, con base en el autovalor medio o usando un diagrama de sedimentación, decidir cuántos componentes retener.

7.2. Desarrollo del Análisis

La navegación a través de las pestañas muestra que el conjunto de datos, en relación con sus variables numéricas, puede ser representado por un conjuto de variables más pequeño que retiene el \(77.05\) \(\%\) de la variabilidad del conjunto. En particular:

La Matriz ACP muestra seis dimensiones donde solo la primera retiene el \(77.05\) \(\%\), la siguiente el \(10.33\) \(\%\) y las demás solo porcentajes con parte entera de una cifra. En este sentido, la representatividad de la combinación lineal que define a la dimensión 1 es significativamente alta en comparación con las demás. Como esta matriz es muda en relación con las variables originales se sigue indagando la identificación de las variables que más contribuyan a la dimensión de valor propio más alto.

La Matriz de Correlaciones permite continuar con las descripciones de las combinaciones lineales que conforman a la dimensión de mayor interés: la dimensión 1. Así, esta matriz, como se mostró en la sección 3.2., ayuda a verificar que la intensidad de las corelaciones es más alta y siempre positiva entre las variables: TOEFL_Score, GRE_Score, CGPA y Chance_of_Admit, asunto esperado en relación con el fenómeno estudiado, por lo tanto, se podría esperar que estas variables participaran en la combinación lineal que define a la dimensión 1.

La pestaña de Valores y Vectores Propios muestra estos objetos calculados a partir de la matriz de correlaciones del conjunto de datos. En este sentido, se garantiza que la suma de los valores propios sea igual a la dimensión de dicha matriz y a la variabilidad total del conjunto, por lo cual las proporciones de retención de variabilidad son de cálculo inmediato. Además, la matriz de vectores propios define para cada componente, en relación con cada variable del conjunto de datos, los coeficientes de la combinación lineal que la conforman, por ejemplo, con un ajuste a dos cifras decimales, la componente 1 estaría representada por la combinación lineal (donde \(G\) es GRE_Score, \(T\) es TOEFL_Score, \(S\) es SOP, \(L\) es LOR, \(CG\) es CGPA y \(CA\) es Chance_of_Admit y además, son variables estandarizadas):\[Componente_1 = 0.41*G+0.42*T+0.39*S+0.37*L+0.44*CG+0.43*CA\]Hasta este punto, se puede observar que se dispone de un número de dimensiones igual al número de variables tratadas, con la salvedad que las variables nuevas son incorreladas entre sí, ver la pestaña Correlaciones Comparadas.

Por último, el Gráfico de Cattell y el Gráfico de Cattell-Kaiser, de codo y sedimentación, inducen a la elección de una componente en la reducción de dimensión que retiene la cantidad de variabilidad suficiente para tratar el problema. Sin embargo, debe resaltarse que se propone elegir con base en criterios más usados, a cambio de criterios de aceptación universal. El Gráfico de Cattell muestra que los cambios en la pendiente indican que la capacidad explicativa de la dimensión 1 es alta comparada con el resto. Así, el de Cattell-Kaiser al conjugar el instrumento gráfico anterior con el criterio de Kaiser en la misma gráfica apoya que la cantidad de dimensiones suficientes por retener es una, aclarando que esta elección retenga un porcentaje de variabilidad adecuado para estudiar el problema.

Matriz ACP

get_eigenvalue(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F))
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  4.6229170        77.048617                    77.04862
## Dim.2  0.6197827        10.329711                    87.37833
## Dim.3  0.2820316         4.700527                    92.07885
## Dim.4  0.1992199         3.320332                    95.39919
## Dim.5  0.1581864         2.636441                    98.03563
## Dim.6  0.1178624         1.964373                   100.00000

Matriz de Correlaciones

round(cor(Admission_Dataset[,-c(1,2,8,9)]),2)
##                 GRE_Score TOEFL_Score  SOP  LOR CGPA Chance_of_Admit
## GRE_Score            1.00        0.84 0.61 0.56 0.83            0.80
## TOEFL_Score          0.84        1.00 0.66 0.57 0.83            0.79
## SOP                  0.61        0.66 1.00 0.73 0.72            0.68
## LOR                  0.56        0.57 0.73 1.00 0.67            0.67
## CGPA                 0.83        0.83 0.72 0.67 1.00            0.87
## Chance_of_Admit      0.80        0.79 0.68 0.67 0.87            1.00

Valores y Vectores Propios

princomp(Admission_Dataset[,-c(1,2,8,9)], cor = TRUE)$sdev^2
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6 
## 4.6229170 0.6197827 0.2820316 0.1992199 0.1581864 0.1178624
princomp(Admission_Dataset[,-c(1,2,8,9)], cor = TRUE)$loadings[ ,1:6]
##                    Comp.1     Comp.2      Comp.3     Comp.4      Comp.5
## GRE_Score       0.4127781  0.4077294  0.02539719  0.3509029  0.72123826
## TOEFL_Score     0.4160056  0.3397387 -0.24669025  0.4574809 -0.65951168
## SOP             0.3855091 -0.4887667 -0.73602577 -0.1872366  0.15066692
## LOR             0.3662513 -0.6631878  0.52149384  0.3899370 -0.03811828
## CGPA            0.4372217  0.1447341  0.08859141 -0.3349520 -0.01437723
## Chance_of_Admit 0.4273564  0.1366578  0.34199519 -0.6068585 -0.14317642
##                      Comp.6
## GRE_Score        0.13931437
## TOEFL_Score      0.08010298
## SOP              0.11400812
## LOR             -0.02412840
## CGPA            -0.81709316
## Chance_of_Admit  0.54125202

Correlaciones Comparadas

par(mfrow=c(1,2))
corrplot::corrplot(cor(Admission_Dataset[,-c(1,2,8,9)]), method = "color", type = "upper", number.cex = 0.4)
corrplot::corrplot(cor(princomp(Admission_Dataset[,-c(1,2,8,9)], cor = TRUE)$scores), method = "color", type = "upper", number.cex = 0.4)

Gráfico de Cattell

fviz_eig(PCA(Admission_Dataset[,-c(1,2,8,9)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")

Gráfico de Cattell-Kaiser

scree(Admission_Dataset[,-c(1,2,8,9)],factors = FALSE, pc = TRUE, main ="")

8. Calidad de Representación

Al retomar el trabajo de (Díaz Morales & Morales Rivera, 2012) se verifica que, una vez reducida la dimensionalidad del conjunto de datos y entendido que sus variables (estandarizadas) están representadas gráficamente por proyecciones de la hiperesfera de correlaciones, es necesario iniciar la interpretación de componentes a partir de dichas correlaciones, para luego la calidad de sus representaciones dada la reducción dimensional del conjunto de datos en términos de sus variables.

8.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se demanda determinar la calidad de representación de las variables respecto a la cantidad de dimensiones calculadas que retienen la mayor cantidad de variabilidad, ver la sección 7.

8.2. Desarrollo del Análisis

La navegación a través de las pestañas muestra que la reducción de la dimensionalidad del conjunto de datos conduce analizar las calidades de representación en términos de la escala de contribuciones relativas basada en un cociente de proyecciones con propiedades aditivas y de respuesta en escala continua entre \(0\) y \(1\). Así, en particular:

El Círculo de Correlaciones expresa que se puede concebir una compenente tipo tamaño en el sentido de que la dimensión 1 muestra en él una correlación positiva con las seis variables de interés, además cercanas a la frontera del círculo unitario y significativamente próximas al eje que la representa. Por otro lado, la dimensión 2 contrapone a las variables LOR y SOP con las demás. Otro aspecto por resaltar es la correlación mostrada entre pares de variables, que en términos del fenómeno estudiado conservan su naturaleza correlacional esperada hasta este punto del análisis. Un ejemplo resaltable es el par SOP y LOR que, en cierto sentido, están influidas por la subjetividad, véase la sección 2.

La Matriz de Representación, por otro lado, muestra valores significativamente cercanos a 1 del cociente de proyecciones coseno cuadrado en relación con la dimensión 1. En este sentido, los puntos proyectados están altamente asociados con este componente. Así, la estaña que muestra la Calidad de Representación indica en su escala un piso alto de \(0.84\) de esta manera las calidades de representación, en relación con la componente 1, están encabezadas por CGPA y cierran con SOP. Cabe aclarar que la dimensión 2 sostiene una mejor representación de LOR que de SOP, por lo tanto, la calidad de representación de la primera en relación con la dimensión 1 se ve afectada.

Por último, las Coordenadas Individuales ayudan, aunque de manera menos digestiva, a identificar a nivel de observaciones a los perfiles de los registros, en este caso estudiantes, en relación con las, por lo menos, dimensiones más importantes de retención de variabilidad: las componentes 1 y 2. Por ejemplo, al observar los registros 1, 9, 23, se manifiestan las semejanzas entre 1 y 23 en oposición de ambos con 9, incluso al considerar a la variable peor representada SOP.

Círculo de Correlaciones

fviz_pca_var(PCA(Admission_Dataset[,-c(1,2,8,9)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())

Matriz de Representación

(get_pca_var(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F)))$cos2
##                     Dim.1      Dim.2        Dim.3       Dim.4        Dim.5
## GRE_Score       0.7876792 0.10303471 0.0001819152 0.024530510 8.228615e-02
## TOEFL_Score     0.8000450 0.07153678 0.0171633381 0.041694489 6.880409e-02
## SOP             0.6870452 0.14806169 0.1527860873 0.006984159 3.590915e-03
## LOR             0.6201182 0.27259164 0.0767001373 0.030291557 2.298454e-04
## CGPA            0.8837298 0.01298318 0.0022135076 0.022351052 3.269787e-05
## Chance_of_Admit 0.8442996 0.01157466 0.0329866161 0.073368148 3.242741e-03
##                        Dim.6
## GRE_Score       2.287532e-03
## TOEFL_Score     7.562625e-04
## SOP             1.531958e-03
## LOR             6.861706e-05
## CGPA            7.868979e-02
## Chance_of_Admit 3.452823e-02

Calidad de Representación

fviz_pca_var(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), col.var="cos2", gradient.cols=c("#00AFBB","#E7B800","#FC4E07"), repel = TRUE)

Coordenadas Individuales

head((PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##          Dim.1       Dim.2       Dim.3       Dim.4        Dim.5       Dim.6
## 1   3.66199019 -0.44632765 -0.04355921  0.24316486  0.017016882 -0.21656303
## 2   1.19446218  0.73276087 -0.32814709  0.22842243  0.500315331 -0.11454589
## 3  -0.84979414  0.21025529 -0.35781782  0.16841716  0.277052946  0.70366065
## 4   0.29352000 -1.07510412  0.52840810 -0.44035081  0.022712146  0.32426628
## 5  -1.63376006 -0.50197420 -0.69858584  0.18077296  0.196680136  0.01208760
## 6   2.30415785 -1.04317671  0.81572439 -0.58984239 -0.005863787  0.04832797
## 7   0.11435288  0.04426511 -0.55778114  0.67583330 -0.008454658  0.65668699
## 8  -1.33319919  1.09523940 -0.64182557  0.14097961  0.121311282  0.53850632
## 9  -3.35109245 -0.93258034  0.55044116 -0.15675362 -0.230221499 -0.38858777
## 10 -0.70518251 -0.27624655  1.00503641  1.18722583  0.635525284 -0.93744778
## 11 -0.29903917  0.48517068  0.19973837  1.34630477  0.870978323 -0.42605295
## 12  1.91250151  0.29349042 -0.38344367  0.20818908  0.170392628  0.10043733
## 13  1.91053416  0.23513132 -0.21577217  0.51368146  0.182435980 -0.23939216
## 14 -0.95161415  0.46272070  1.12821047  0.29277119 -0.561789232  0.40712161
## 15 -1.63366474 -0.42045583  1.12531747 -0.37340051  0.206735944  0.04749185
## 16 -1.38952108 -0.17085741  1.02199451  0.25321293  0.333470659 -0.31946818
## 17 -0.09475078  0.01051262  0.82448700 -0.11605999  0.228086329 -0.30609341
## 18 -0.63522387  0.17510274  0.90749587  0.30600586  0.489710926  0.62737017
## 19  0.13054730 -0.18871990  1.00151472  0.21254670 -0.007618938 -0.50549162
## 20 -1.40069985  0.63282752  0.41187500 -0.54609747 -0.138958575 -0.47666697
## 21 -1.71366787 -0.82306966  0.85181743  0.01762092 -0.154540513  0.56819308
## 22 -0.21792196 -1.85700802  0.88942803  0.40713293 -0.170286359  0.36076889
## 23  3.54618997  0.61579548 -0.05532575 -0.06004547 -0.294653496 -0.02737099

9. Contribuciones

Según el trabajo de (Díaz Morales & Morales Rivera, 2012) la interpretación de resultados está vinculada con el cálculo de coordenadas, contribuciones, cosenos cuadrados, etc, por lo tanto, la conceptualización de las variables debe ser clara para establecerla con la mayor claridad posible, es decir, los datos deben ponerse en contexto. En este sentido, la contribución de una variable a una componente allana el camino de la interpretación de resultados. Esto se hace en este apartado en el sentido de calcular lor aportes con que cada variable participa para definir a cada componente generada.

9.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se demanda determinar las contribuciones que hace cada variable a la construcción de cada componente.

9.2. Desarrollo del Análisis

La navegación a través de las pestañas permite reconocer en representaciones numéricas y gráficas las contribuciones de las variables del conjunto de datos a la construcción de cada componente. Así, se entiende cuánta variabilidad explica cada variable de la variabilidad total de la componente con que esté involucrada. en particular:

La Matriz de Contribuciones muestra en términos relativos la retención de variabilidad que tiene cada variable en la construcción de cada componente. Así, los diagramas de barras visualizados a través de las pestañas desde Contribuciones a D1 hasta Contribuciones a D6, muestran con base en diagramas de barras las respectivas contribuciones que hacen las variables para explicar la varianzar en cada componente; además, cada gráfico incluye una línea que ayuda a identificar la contribución media, esto ayuda a identificar con mayor facilidad a las variables que contribuyen con mayor explicación de variabilidad de los componentes que conforman.

En Contribuciones a D1 se visualiza que las variables por enciama de la contribución media: CGPA, Chance_of_Admit, TOEFL_Score y GRE_Score retienen aproximadamente el \(71.72\) \(\%\) de la variabilidad del componente 1.

En Contribuciones a D2 se visualiza que las variables por enciama de la contribución media: LOR y SOP retienen aproximadamente el \(67.87\) \(\%\) de la variabilidad del componente 2.

En Contribuciones a D3 se visualiza que las variables por enciama de la contribución media: SOP y LOR retienen aproximadamente el \(81.37\) \(\%\) de la variabilidad del componente 3.

En Contribuciones a D4 se visualiza que las variables por enciama de la contribución media: Chance_of_Admit y TOEFL_Score retienen aproximadamente el \(57.76\) \(\%\) de la variabilidad del componente 4.

En Contribuciones a D5 se visualiza que las variables por enciama de la contribución media: GRE_Score y TOEFL_Score retienen aproximadamente el \(95.51\) \(\%\) de la variabilidad del componente 5.

Por último, en Contribuciones a D6 se visualiza que las variables por enciama de la contribución media: CGPA y Chance_of_Admit retienen aproximadamente el \(96.06\) \(\%\) de la variabilidad del componente 6.

Con los datos procesados hasta ahora se puede proceder con la intepretación de los componentes.

Matriz de Contribuciones

(get_pca_var(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F)))$contrib
##                    Dim.1     Dim.2       Dim.3     Dim.4       Dim.5
## GRE_Score       17.03858 16.624329  0.06450171 12.313282 52.01846278
## TOEFL_Score     17.30607 11.542236  6.08560812 20.928876 43.49556571
## SOP             14.86172 23.889292 54.17339277  3.505753  2.27005215
## LOR             13.41400 43.981812 27.19558265 15.205085  0.14530029
## CGPA            19.11628  2.094796  0.78484383 11.219286  0.02067047
## Chance_of_Admit 18.26335  1.867535 11.69607091 36.827718  2.04994861
##                       Dim.6
## GRE_Score        1.94084948
## TOEFL_Score      0.64164873
## SOP              1.29978503
## LOR              0.05821794
## CGPA            66.76412347
## Chance_of_Admit 29.29537534

Contribuciones a D1

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 1, top = 10)

Contribuciones a D2

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 2, top = 10)

Contribuciones a D3

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 3, top = 10)

Contribuciones a D4

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 4, top = 10)

Contribuciones a D5

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 5, top = 10)

Contribuciones a D6

fviz_contrib(PCA(Admission_Dataset[,-c(1,2,8,9)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 6, top = 10)

10. Interpretación de Componentes

Con base en (Díaz Morales & Morales Rivera, 2012) se sabe que a partir de las coordenadas de los registros dimensionalmente reducidos se puede ubicar en un plano de factores para efectos de análisis e interpretación. Así, las variables reducidas son las componentes principales que se grafican como ejes en un plano, y los valores que tomen son los puntajes de las componentes. Como bien se explica en el mismo trabajo, las distancias entre los puntos definidos por los puntajes de las componentes tiene un significado relevante al ayudar a establecer semejanzas de perfiles en las observaciones hechas. Sin embargo, los valores semejantes de las variables pueden darse solo en algunas de ellas, sin esperar necesariamente a que suceda en todas. Así, se espera que las distancias en el espacio dimensional original de las observaciones queden bien representadas en el espacio reducido de las componentes.

10.1. Planteamiento del Problema

Con base en el conjunto de datos descrito en la sección 2 se demanda definir e interpretar sus componentes principales.

10.2. Desarrollo del Análisis

La navegación a través de las pestañas permite visualizar objetos gráficos y matriciales que, al incluir lo hecho en las secciones anteriores, ayudan a robustecer la interpretación de las componentes calculadas. Como se mostró en la sección 7, la cantidad de componentes seleccionadas se redujo (según el criterio de Kaiser) a una y se estableció que la componente 1 retiene el \(77.05\) \(\%\) de la variabilidad de los datos. Así, en el círculo de correlaciones de la sección 8 se aprecia que la representación de las variables conjugadas en la componente 1 la configuran como una de tipo tamaño, lo que puede interpretarse como una especie de índice de proporcionalidad directa. Esto también se apoya con base en el hecho de que todas las variables presentan calidades de representación entre \(0.62\) y \(0.88\). En consecuencia, cuanto mayor sea el valor las variables mayor será el estado de favorabilidad de que el estudiante sea admitido por la univrsidad de su preferencia. Así, dada la naturaleza de las variables esta componente puede representar para un estudiante su medida de competitividad formativa. Al respecto:

Las pestañas Biplot de Variables y Registros Totales en UR (University Rating), G (Gender) y R (Research), muestran, con base en las agrupaciones que estas variables categóricas pueden establecer, la representación en dimensionalidad reducida en el plano de factores de registros y dimensiones con base en los puntajes por componentes. En este sentido, es posible apreciar que las agrupaciones con base en University_Rating y Research capturan diferencias acentuadas en la distribuciones de las observaciones, contrario a la agrupación con base en Gender.

Por último, para facilitar la verificación de la ubicación de puntajes en el plano de componentes (en particular, siempre conformado por las componentes 1 y 2 por el interés que sucitan) y, asimismo, las semejanzas de perfiles y las correlaciones entre variables, se dispuso de las pestañas Coordenadas Individuales [Subconjunto UR] y Biplot de Variables y Registros [Subconjunto UR]. Estas muestran, con base en un subconjuto de 61 registros muestrado aleatorio simple, los puntajes por componentes y el biplot de ese subconjunto, con base en la agrupación provista por la varaible categórica University_Rating, sin pérdida significativa de detalles. Esto, se insiste, solo tiene fines didácticos, debido a la dificultad de identificación visual que presenta el conjunto original que contiene 400 registros.

Biplot de Variables y Registros [Total UR]

data_UR <- Admission_Dataset_Initial[,-c(1,2,8)]
data_All <- cbind(Admission_Dataset_Initial[,-c(1,2,8,9)], data_UR$University_Rating)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total G]

data_UR <- Admission_Dataset_Initial[,-c(1,8,9)]
data_All <- cbind(Admission_Dataset_Initial[,-c(1,2,8,9)], data_UR$Gender)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Biplot de Variables y Registros [Total R]

data_UR <- Admission_Dataset_Initial[,-c(1,2,9)]
data_All <- cbind(Admission_Dataset_Initial[,-c(1,2,8,9)], data_UR$Research)
fviz_pca_biplot(PCA(data_All, ncp = 6, scale.unit = TRUE, graph = F, quali.sup = 7), axes = c(1, 2), repel = TRUE, habillage = 7)

Coordenadas Individuales [Subconjunto UR]

set.seed(780728)
data_61_UR <- Admission_Dataset_Initial[sample(1:nrow(Admission_Dataset_Initial),61),-c(1,2,8)]
set.seed(780728)
data_61 <- cbind(Admission_Dataset_Initial[sample(1:nrow(Admission_Dataset_Initial),61),-c(1,2,8,9)], data_61_UR$University_Rating)
head(PCA(data_61, ncp = 6, scale.unit = T, graph = F, quali.sup = 7)$ind$coord, n = 61L)
##          Dim.1       Dim.2        Dim.3         Dim.4       Dim.5       Dim.6
## 1   2.68761751  0.02450021 -0.174588047 -0.3744681469  0.20243105  0.09714639
## 2  -0.68733407  0.09559234 -0.429878544  0.3006483758  0.55882375 -0.41539839
## 3  -2.66688446  0.99297045 -0.154631808  0.2955375778  0.91070623 -0.54643606
## 4  -2.60547963  0.90034536 -0.019614410 -0.0213467292 -0.11686267  0.21276009
## 5   1.08112756  0.40126269  0.092843433  0.0881547303 -0.54870098  0.12868982
## 6   1.84519346  0.73863622  0.122725654  0.3044756351 -0.25870078 -0.29131881
## 7  -0.58747951 -0.02256539  0.456341153 -1.2163134978 -0.01333260 -0.94317535
## 8   4.01404297  0.07462346  0.109467778 -0.6287994639  0.60476060 -0.09211162
## 9  -0.91086676  0.33014131 -0.213824989 -0.4796112753 -0.27321962  0.17828584
## 10  1.99972822 -0.51428654 -0.239308944 -0.1615319470  0.04151905 -0.01116718
## 11 -0.95952733 -0.26982240 -0.628357160 -0.2695572128 -0.41111602  0.24409785
## 12 -0.19766524 -0.28396958 -0.159860979 -0.1187760407 -0.35433595  0.16222254
## 13 -0.11229774  0.04922496 -0.520651363 -0.2764481615 -0.23244849  0.60623579
## 14  1.31908921 -0.83063861  0.459124717  0.0260651127 -0.26542984 -0.06860382
## 15  0.72561624  0.69347072  0.441628837 -0.4125443603  1.09108940  0.54905112
## 16 -3.05518824 -1.00327852 -0.517772977  0.0169673161  0.11745016 -0.48627516
## 17 -0.32128795  1.31505890 -0.334220920  0.5188724696 -0.63373067 -0.31543233
## 18  0.59398643  1.05012623  0.823718459  0.0006562314  0.39817645  0.37906406
## 19  4.31763412 -0.76639535  0.305614507  0.3514348648  0.06165635  0.10729655
## 20 -2.66850653 -0.88007178 -1.150343969  0.4998803377  0.64189881  0.47161684
## 21  2.49833145  0.33680478 -0.497108151 -0.1493167937  0.73518345 -0.01616226
## 22  4.42861912 -1.19651010 -0.065398012 -0.0662251616 -0.12480678 -0.21829986
## 23 -0.10138583  0.26657454  1.025802277  0.1844089350 -0.23952973  0.21237382
## 24  0.77832836  0.51483734 -0.586749977 -0.3660228511 -0.22881809  0.03093306
## 25 -3.34603035 -0.73197519  0.572679946 -0.2522335792  0.45386536  0.58574083
## 26 -1.12156436  0.47009460  0.710676700 -0.2693120533  0.03905343  0.28650198
## 27  1.12573128 -0.17577080 -0.100141703 -0.1546231843 -0.24919779 -0.45040087
## 28  3.07067126  0.35323879  0.757028987  0.4247162580 -0.12499666 -0.09729370
## 29 -2.92576647  0.11991747  0.250445228 -0.2299849763  0.13108636  0.13961852
## 30 -1.57082897  0.82519550  0.448043093 -0.0817267972 -0.19123476 -0.01806606
## 31  3.88893564  0.20786100  0.370786584  0.4214452559 -0.27081769  0.18277722
## 32 -0.09514144  0.11557851  0.021320640  0.6302141984  0.72768874 -0.64366773
## 33  0.08471986  1.61655715 -0.188909993 -0.7008855995  0.13920525 -0.02845328
## 34 -0.59184199 -0.22876447 -0.926126623 -0.2235325185 -0.17851703  0.48899087
## 35 -3.27720201 -0.87836770  0.823764048 -0.3562505606  0.97461197  0.27193935
## 36 -1.00907062 -0.60981916 -0.366548178 -0.0095160479 -0.74853286 -0.07287862
## 37 -3.44740002  0.09518884 -0.279026284  1.2727724524 -0.29958247 -0.03048890
## 38 -0.61814715  1.35139235 -0.147464086  0.5287327428 -0.26151384  0.23159263
## 39 -0.95360489  0.60765498 -0.840617577  0.0538599827 -0.37791331  0.27308231
## 40 -0.50218812 -0.31602204 -0.856741467 -0.2330804793 -0.02917330  0.27512267
## 41  2.10626250 -1.04424439 -0.963150163  0.3392035768  0.31987492  0.03821925
## 42  1.28322709 -0.62926111  0.441965914 -0.3562454098 -0.40127799  0.01056439
## 43  2.86084387 -0.97743658 -0.189055903 -0.3257769792 -0.24103693 -0.02533912
## 44  0.11095420  0.09104799  0.329152682 -0.2503309611 -0.05860961 -0.31122317
## 45  0.86048677 -1.06837705  1.669752773  0.7807790722 -0.18776456  0.15605708
## 46 -2.01348062 -0.35196960  0.153198506 -0.2101122481 -0.33640760 -0.24733626
## 47  0.49914560  0.99619621  0.203342566 -0.6055245095 -0.15223639 -0.39848712
## 48 -0.18678673  0.07290830  0.277304278  0.2073225308 -0.11177696  0.50750739
## 49  0.53103836  0.64282486 -0.737406584  0.0797141721  0.64352663  0.29279878
## 50 -3.35949243 -0.44687930  0.006172428 -0.0045161417 -0.38323628 -0.43416026
## 51 -1.76561250 -0.71357365  0.119940618  0.3131484601 -0.39483497 -0.13067773
## 52 -0.61646599  0.78723572  0.792587313  0.0458368814 -0.47170228 -0.07547270
## 53 -1.13208355  0.23098651  0.334020200 -0.9375383689 -0.14012116 -0.18977532
## 54 -0.27645335  1.39981251 -0.625640992  0.8891418808 -0.14251466 -0.21940402
## 55  2.88576942  1.38441807 -0.193040456  0.1296641060 -0.02106329  0.03478427
## 56 -5.04977695 -0.90629264  0.026357340 -0.5769148808  0.38735732 -0.21288001
## 57  1.92705611 -0.90735952 -0.718194109 -0.2719132197 -0.22644798 -0.26096780
## 58  3.43755620 -1.17933752 -0.453693737 -0.0563528841  0.04013918  0.18174093
## 59  0.07536328 -0.43227807  0.549529614  0.5870839780  0.36357097  0.78670503
## 60  0.69062813 -0.65223897  0.232067290  1.0279357809  0.99227537 -0.88356806
## 61 -2.99486239 -1.13477288  0.350664541  0.3286601252 -0.87440821  0.01140428

Biplot de Variables y Registros [Subconjunto UR]

set.seed(780728)
data_61_UR <- Admission_Dataset_Initial[sample(1:nrow(Admission_Dataset_Initial),61),-c(1,2,8)]
set.seed(780728)
data_61 <- cbind(Admission_Dataset_Initial[sample(1:nrow(Admission_Dataset_Initial),61),-c(1,2,8,9)], data_61_UR$University_Rating)
fviz_pca_biplot(PCA(data_61, ncp = 6, scale.unit = T, graph = F, quali.sup = 7), axes = c(1, 2), repel = T, habillage = 7)

Conclusiones

Complementariamente a los análisis que fueron expuestos en las secciones de estudio es importante hacer una mención global sobre el problema considerado a la luz de lo obtenido.

Como se menciona en el trabajo hecho en el curso Análisis de Regresión (que puede ser consultado temporalmente a través de: https://rpubs.com/glibrerosl/Applied-Statistics-FULL), las aspiraciones de un estudiante extranjero para ingresar a una universidad norteamericana se enfrentan a un elevado grado de competición. Además, se constata, desde la perspectiva de estudio multivariable, que, por lo menos descriptivamente, una variable clasificadora categórica como el sexo, resulta muy poco significativa formar grupos diferenciados entre los estudiantes con aspiraciones de ingreso, asunto que contrasta con los relatos socio-populistas basados en falacias ad hominem. El dato, si es fino, siempre será objetivo.

Complementariamente, todas las pruebas de normalidad multivariante resultaron negativas, salvo que a nivel univariado la variable CGPA presentó distribución normal en todas ellas. Así, el deterioro de las propiedades de independencia lineal juegan a favor de la síntesis de información a través de la estimación de componentes principales. Este pudo describir una medida de competitividad formativa que conjuga, con una retención de \(77.05\) \(\%\) la variabilidad del conjunto de datos, la naturaleza interpretativa del fenómeno estudiado. Así, cuanto mayor sea el valor las variables que registra un estudiante para aplicar a una plaza en una universidad de su elección, mayor será el estado de favorabilidad de que el estudiante sea admitido por la universidad de su preferencia.

Por último, es importante resaltar el aspecto técnico relacionado con el procesamiento estadístico hecho en este estudio a nivel de robustez, eficiencia e integración que R, RStudio y RMarkdown ofrecen al usuario para que este se pueda enfocar en él sin pasar mayores inconvenientes con el soporte documental para presentarlo.

Referencias

Aldás, J., & Uriel, E. (2017). Análisis multivariante aplicado con R (2nd ed.). ALFACENTAURO.
Aristizábal R., W. D. (2017). Análisis multivariado unidad 1 estadística descriptiva multivariada. In Fundación Universitaria Los Libertadores.
Cramer, Harald. (1953). Métodos matemáticos de estadística (1st ed.). AGUILAR.
Daniel, Wayne W. (2013). Bioestadística base para el análisis de las ciencias de la salud (4th ed.). LIMUSA WILEY.
Devore, Jay L. (2008). Probabilidad y estadı́stica para ingenierı́a y ciencias (7th ed.). CENGAGE LEARNING.
Díaz Morales, L. G., & Morales Rivera, M. A. (2012). Análisis estadístico de datos multivariados (1st ed.). UNAL.
Doornik, J. A., & Hansen, H. (2008). An omnibus test for univariate and multivariate normality. Oxford Bulletin of Economics and Statistics. https://doi.org/10.1111/j.1468-0084.2008.00537.x
Hair, J. F., Anderson, R. E., Tatham, R. L., & Black, W. C. (1999). Análisis multivariante (5th ed.). PRENTICE HALL.
Porras C., J. C. (2016). Comparison test mutivariate normal. Anales Científicos. https://dialnet.unirioja.es/descarga/articulo/6171231.pdf
Tucker, H. G. (1973). Introducción a la teoría matemática de las probabilidades y a la estadítica (1st ed.). VICENS-VIVES.
LS0tDQp0aXRsZTogIioqQWRtaXNpw7NuIGVuIGxhIFVuaXZlcnNpZGFkKioiDQpzdWJ0aXRsZTogIkVzdHVkaW8gZGUgQW7DoWxpc2lzIE11bHRpdmFyaWFkbyBjb24gYmFzZSBlbiB1biBjb25qdW50byBkZSBkYXRvcyBkZSBhc3BpcmFudGVzIGV4dHJhbmplcm9zIHBhcmEgc2VyIGFkbWl0aWRvcyBlbiBlc3R1ZGlvcyBzdXBlcmlvcmVzIGVuIEVFLlVVLiINCmF1dGhvcjogIlBvcjogR2lhbmNhcmxvIExpYnJlcm9zIExvbmRvw7FvOjpnbGlicmVyb3NsQGxpYmVydGFkb3Jlcy5lZHUuY28iDQpkYXRlOiAiRXN0dWRpbyBNdWx0aXZhcmlhbnRlIEVsYWJvcmFkbyBlbnRyZSBmZWJyZXJvIHkgbWFyem8gZGUgMjAyMyBjb21vIGFjdGl2aWRhZCBmb3JtYXRpdmEgeSBldmFsdWF0aXZhIGRlbCBjdXJzbyBBbsOhbGlzaXMgTXVsdGl2YXJpYW50ZSBkZSBsYSBlc3BlY2lhbGl6YWNpw7NuIGVuIEVzdGFkw61zdGljYSBBcGxpY2FkYSAobW9kYWxpZGFkIHZpcnR1YWwpLiAqQ2llcnJlIGRlIEFjdHVhbGl6YWNpb25lcyBbVDE6IDE0OjMzIDE2LWZlYi0yMDIzXSBbVDI6IDExOjU5IDI2LWZlYi0yMDIzXSouIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogbHVtZW4NCmJpYmxpb2dyYXBoeTogYmlibGlvZ3JhZmlhX01FLmJpYg0KY3NsOiBhcGEuY3NsDQpsaW5rLWNpdGF0aW9uczogeWVzDQotLS0NCjwhLS0gQ29uZmlndXJhY2nDs24gR2xvYmFsIGRlIFIgLS0+DQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShhbmRyZXdzKQ0KbGlicmFyeSh0Y2x0aykNCmxpYnJhcnkoYXBscGFjaykNCmxpYnJhcnkoZ3JhcGhpY3MpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShNVk4pDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShGYWN0b01pbmVSKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KbGlicmFyeShwc3ljaCkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSkNCg0KQWRtaXNzaW9uX0RhdGFzZXQgPC0gcmVhZF9leGNlbCgiRDovWkIvWzJdIEFjYWRlbWljYXMvWzEwLjFdIEVzcGVjaWFsaXphY2lvbi9bMF0gQ3Vyc29zL1szXSBBbnNfTXVsdGl2YXJpYW50ZS9UYXJlYXMvQWRtaXNzaW9uX0RhdGFzZXQueGxzeCIpDQpBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsIDwtIHJlYWRfZXhjZWwoIkQ6L1pCL1syXSBBY2FkZW1pY2FzL1sxMC4xXSBFc3BlY2lhbGl6YWNpb24vWzBdIEN1cnNvcy9bM10gQW5zX011bHRpdmFyaWFudGUvVGFyZWFzL0FkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWwueGxzeCIpDQpgYGANCg0KPGEgbmFtZT0ic2VjMSI+PC9hPg0KDQojIyAqKk9iamV0aXZvIHkgQW5vdGFjaW9uZXMgW0V0YXBhIDFdKioNCkVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIGVzdGEgcHJpbWVyYSBldGFwYSBkZSBlc3R1ZGlvIG1vc3RyYXLDoSBjw6FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMgY29uIGJhc2UgZW4gdW4gY29uanVudG8gZGUgZGF0b3MgZGVzZGUgdW4gZW5mb3F1ZSBkZSBlc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmEgbXVsdGl2YXJpYW50ZTsgYWRlbcOhcywgZGUgaW5jbHVpciB1bmEgcHJ1ZWJhIGVzdGFkw61zdGljYSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBzb2JyZSBlbGxvcy4NCg0KRWwgY29uanVudG8gZGUgZGF0b3MgZGUgdHJhYmFqbyBlcyBkZXNjcml0byBlbiBsYSBbc2VjY2nDs24gMl0oI3NlYzIpLiBDYWJlIGFub3RhciBxdWUgbG9zIGZ1bmRhbWVudG9zIHRlw7NyaWNvcyBwcm92aWVuZW4gZGUgbm90YXMgZGUgY2xhc2UgZGVsIGN1cnNvICoqQW7DoWxpc2lzIE11bHRpdmFyaWFudGUqKiBkaWN0YWRvIHBvciBlbCBwcm9mZXNvciBKdWFuIENhcmxvcyBSdWJyaWNoZSBDw6FyZGVuYXMgcGFyYSBsYSBFc3BlY2lhbGl6YWNpw7NuIGVuIEVzdGFkw61zdGljYSBBcGxpY2FkYSwgbW9kYWxpZGFkIHZpcnR1YWwgKGNvaG9ydGUgMjAyMi00KSwgZGUgbGEgRnVuZGFjacOzbiBVbml2ZXJzaXRhcmlhIExvcyBMaWJlcnRhZG9yZXM7IHkgZGUgbG9zIGxpYnJvczogQW7DoWxpc2lzIE11bHRpdmFyaWFudGUgQXBsaWNhZG8gY29uIFIgW0BBTUFSQWxkYXMtVXJpZWwyZWRdIGRlIEpvYXF1w61uIEFsZMOhcyB5IEV6ZXF1aWVsIFVyaWVsLCBBbsOhbGlzaXMgTXVsdGl2YXJpYW50ZSBkZSBKb3NlcGggSGFpciwgUm9scGggQW5kZXJzb24sIFJvbmFsZCBUYXRoYW0geSBXaWxsaWFtIEJsYWNrIFtAQU1IYWlyLWV0QWw1ZWRdLCBBbsOhbGlzaXMgRXN0YWTDrXN0aWNvIGRlIERhdG9zIE11bHRpdmFyaWFkb3MgZGUgTHVpcyBHdWlsbGVybW8gRMOtYXogTW9ucm95IHkgTWFyaW8gQWxmb25zbyBNb3JhbGVzIFJpdmVyYSBbQEFFRE1EaWF6LU1vcmFsZXMxZWRdLCBJbnRyb2R1Y2Npw7NuIGEgbGEgVGVvcsOtYSBNYXRlbcOhdGljYSBkZSBsYXMgUHJvYmFiaWxpZGFkZXMgeSBhIGxhIEVzdGFkw61zdGljYSBkZSBIb3dhcmQgVHVja2VyIFtASVRNUEVUdWNrZXIxZWRdIHkgQW7DoWxpc2lzIE11bHRpdmFyaWFkbzogRXN0YWTDrXN0aWNhIE11bHRpdmFyaWFkYSBEZXNjcmlwdGl2YSBkZSBXaWxsaWFtIERhdmlkIEFyaXN0aXrDoWJhbCBSb2Ryw61ndWV6IFtAQU1FREFyaXN0aXphYmFsMjAxN10uDQoNCkVzdGUgdHJhYmFqbyBjb250aW7DumEgZWwgaGVjaG8gZW4gZWwgY3Vyc28gKipBbsOhbGlzaXMgZGUgUmVncmVzacOzbioqIGRpY3RhZG8gcG9yIGVsIHByb2Zlc29yIERhZ29iZXJ0byBCZXJtw7pkZXogcGFyYSBsYSBFc3BlY2lhbGl6YWNpw7NuIGVuIEVzdGFkw61zdGljYSBBcGxpY2FkYSwgbW9kYWxpZGFkIHZpcnR1YWwgKGNvaG9ydGUgMjAyMi00KSwgZGUgbGEgRnVuZGFjacOzbiBVbml2ZXJzaXRhcmlhIExvcyBMaWJlcnRhZG9yZXMuIEVuIGVzdGUgbGEgYmlibGlvZ3JhZsOtYSBjb25zdWx0YWRhIGZ1ZTogcHJvYmFiaWxpZGFkIHkgZXN0YWTDrXN0aWNhIGRlIEpheSBMLiBEZXZvcmUgW0BQRURldm9yZTdlZF0sIEJpb2VzdGFkw61zdGljYSBkZSBXYXluZSBXLiBEYW5pZWwgW0BCRURhbmllbDRlZF0sIE3DqXRvZG9zIE1hdGVtw6F0aWNvcyBkZSBFc3RhZMOtc3RpY2EgZGUgSGFyYWxkIENyYW1lciBbQE1NRUNyYW1lcjFlZF07IG1vdGl2byBwb3IgZWwgY3VhbCBzZSBpbmNsdXllbiBlbiBsYXMgcmVmZXJlbmNpYXMuIEVsIHRyYWJham8gaGVjaG8gZW4gQW7DoWxpc2lzIGRlIFJlZ3Jlc2nDs24gcXVlIHB1ZWRlIHNlciBjb25zdWx0YWRvIHRlbXBvcmFsbWVudGUgYSB0cmF2w6lzIGRlOiBodHRwczovL3JwdWJzLmNvbS9nbGlicmVyb3NsL0FwcGxpZWQtU3RhdGlzdGljcy1GVUxMLg0KDQpQb3Igw7psdGltbywgZXN0ZSB0cmFiYWpvIGZ1ZSBwcm9jZXNhZG8gY29uIGByIFIudmVyc2lvbi5zdHJpbmdgIG1lZGlhZG8gcG9yIFJTdHVkaW8gMjAyMi4xMi4wIEJ1aWxkIDM1MyBlbiB1bmEgcGxhdGFmb3JtYSB4ODZfNjQtdzY0LW1pbmd3MzIuIEFkZW3DoXMsIHBvciBzdSBuYXR1cmFsZXphIGRlIHB1YmxpY2FjacOzbiBlbiBsw61uZWEgeSBwYXJhIGN1bXBsaXIgY29uIGVsIHJlcXVpc2l0byB0ZW1wb3JhbCBkZSBlbnRyZWdhLCBzZXLDoSBhY3R1YWxpemFkbywgY29tbyBtw6F4aW1vLCBoYXN0YSBsYXMgMTE6NTkgcC5tLiBkZWwgbHVuZXMgMTMgZGUgZmVicmVybyBkZSAyMDIzLg0KDQo8YSBuYW1lPSJzZWMyIj48L2E+DQoNCiMjICoqMi4gRGVzY3JpcGNpw7NuIGRlIGxvcyBEYXRvcyoqDQoNCiMjIyAyLjEuIEZ1ZW50ZSBkZWwgQ29uanVudG8gZGUgRGF0b3MNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gc2Ugb2J0dXZvIGNhc2kgdG90YWxtZW50ZSBkZSAqKkthZ2dsZSoqOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2Frc2hheWRhdHRhdHJheWtoYXJlLiBFcyBjb252ZW5pZW50ZSBhbm90YXIgcXVlICoqS2FnZ2xlKiogZXMgdW5hIGNvbXBhw7HDrWEgc3Vic2lkaWFyaWEgZGUgR29vZ2xlIExMQyBxdWUgbWFudGllbmUgdW5hIGNvbXVuaWRhZCBvbmxpbmUgZGUgY2llbnTDrWZpY29zIGRlIGRhdG9zIHkgcHJvZmVzaW9uYWxlcyBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIEVzdGEgZW1wcmVzYSBwZXJtaXRlIGEgc3VzIHVzdWFyaW9zIGVuY29udHJhciB5IHB1YmxpY2FyIGNvbmp1bnRvcyBkZSBkYXRvcywgZXhwbG9yYXIgeSBjcmVhciBtb2RlbG9zIGVuIHVuIGVudG9ybm8gZGUgY2llbmNpYSBkZSBkYXRvcyBiYXNhZG8gZW4gbGEgd2ViLCB0cmFiYWphciBjb24gb3Ryb3MgY2llbnTDrWZpY29zIGRlIGRhdG9zIGUgaW5nZW5pZXJvcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyB5IHBhcnRpY2lwYXIgZW4gY29uY3Vyc29zIHBhcmEgcmVzb2x2ZXIgZGVzYWbDrW9zIGRlIGNpZW5jaWEgZGUgZGF0b3MuDQoNCiMjIyAyLjIuIENvbnRleHRvIGRlbCBDb25qdW50byBkZSBEYXRvcw0KRWwgY29uanVudG8gZGUgZGF0b3MgaW5jbHV5ZSBtw6l0cmljYXMgYWNhZMOpbWljYXMgb2J0ZW5pZGFzIHBvciBlc3R1ZGlhbnRlcyBleHRyYW5qZXJvcyBwYXJhIGFzcGlyYXIgYSBhY2NlZGVyIGEgdW5pdmVyc2lkYWRlcyBkZSBFRS5VVS4gRXN0ZSBjb25qdW50byBkZSBkYXRvcyBzZSBhY3R1YWxpesOzIHBvciDDumx0aW1hIHZleiBlbiBqdWxpbyBkZSAyMDIyLg0KDQojIyMgMi4zLiBEZXNjcmlwY2nDs24gZGVsIENvbmp1bnRvIGRlIERhdG9zIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbCBjb25qdW50byBkZSBkYXRvcyBjb250aWVuZSAxMCBjYW1wb3MgeSA0MDAgcmVnaXN0cm9zLiBVbm8gZGUgbG9zIGNhbXBvcyBlcyBzaW1wbGVtZW50ZSB1biBpZGVudGlmaWNhZG9yIG51bcOpcmljbyBzZWN1ZW5jaWFsIGRlIGxvcyByZWdpc3Ryb3M7IG90cm9zIHRyZXMgc29uIGRlIG5hdHVyYWxlemEgcG9saXTDs21pY2E7IHkgZWwgcmVzdG8gc29uIG51bcOpcmljb3MgZXN0cmljdGFtZW50ZSBwb3NpdGl2b3MuIExhIGxpc3RhIHNpZ3VpZW50ZSBsb3MgZGVzY3JpYmUgZW4gZWwgbWlzbW8gb3JkZW4sIGRlIGl6cXVpZXJkZGEgYSBkZXJlY2hhLCBjb21vIGFwYXJlY2VuIGVuIGVsIHJhbmdvIGRlIGRhdG9zIHF1ZSBsb3MgY29udGllbmUgeSBzZSBlc3RhYmxlY2UgcGFyYSBjYWRhIGNhbXBvLCBleGNlcHRvIGVsIGNhbXBvICoqU2VyaWFsKiosIGVsIHRpcG8gZGUgdmFyaWFibGUgeSBzdSBlc2NhbGEgZGUgbWVkaWNpw7NuIGNvbiBiYXNlIGVuIGxhIG5vbWVuY2xhdHVyYSAodGlwb19kZV92YXJpYWJsZTo6ZXNjYWxhX2RlX21lZGljacOzbltvcmRlbmFtaWVudG9dKToNCg0KLSAqKlNlcmlhbCoqIChpZGVudGlmaWNhZG9yKTogcmVnaXN0cmEgdW4gbsO6bWVybyBzZWN1ZW5jaWFkbyBhIHBhcnRpciBkZSAxIHBhcmEgaWRlbnRpZmljYXIgZGUgZm9ybWEgw7puaWNhIGNhZGEgcmVnaXN0cm8gY29uc2lnbmFkbyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KLSAqKkdlbmRlcioqIChjdWFsaXRhdGl2YTo6bm9taW5hbCk6IHJlZ2lzdHJhIGVsIHNleG8gZGVsIGVzdHVkaWFudGUgZGVsIGN1YWwgc2UgcmVnaXN0cmFyb24gbG9zIGRhdG9zOiAxIGNvcnJlc3BvbmRlIGNvbiB1biBlc3R1ZGlhbnRlIGRlIHNleG8gbWFzY3VsaW5vLCAwIGNvbiB1biBlc3R1ZGlhbnRlIGRlIHNleG8gZmVtZW5pbm8uDQoNCi0gKipHUkUgU2NvcmUqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiByZWdpc3RyYSBlbCBwdW50YWplIHRvdGFsIEdSRSAoZXhhbWVuIGRlIGFjY2VzbyBhIGxhIHVuaXZlcnNpZGFkKSBvYnRlbmlkbyBwb3IgZWwgZXN0dWRpYW50ZS4gR1JFIGVzIHVuIGNvbXBvbmVudGUgY29tw7puIGRlbCBwcm9jZXNvIGRlIGFkbWlzacOzbiBhIGNvbGVnaW9zIG8gdW5pdmVyc2lkYWRlcyBlbiBFRS5VVS4gcXVlIG1pZGUgZWwgcmF6b25hbWllbnRvIHZlcmJhbCwgY3VhbnRpdGF0aXZvLCBsYSBlc2NyaXR1cmEgYW5hbMOtdGljYSB5IGxhcyBoYWJpbGlkYWRlcyBkZSBwZW5zYW1pZW50byBjcsOtdGljbyBxdWUgc2UgaGFuIGFkcXVpcmlkbyBhIGxvIGxhcmdvIGRlIHVuIGV4dGVuc28gcGVyw61vZG8gZGUgdGllbXBvIHkgcXVlIG5vIGVzdMOhbiByZWxhY2lvbmFkb3MgY29uIGNhbXBvIGVzcGVjw61maWNvcyBkZSBlc3R1ZGlvLiBFbCBjYW1wbyBzb2xvIHJlZ2lzdHJhIGRvcyBkZSBsb3MgdHJlcyBjb21wb25lbnRlcyBkZSBsYSBldmFsdWFjacOzbjogcmF6b25hbWllbnRvIHZlcmJhbCB5IGN1YW50aXRhdGl2bywgZW4gdW5hIGVzY2FsYSBkZXNkZSAyNjAgaGFzdGEgMzQwIHB1bnRvcy4gRWwgcmVzdWx0YWRvIGF1c2VudGUgZGVsIHB1bnRhamUgY29ycmVzcG9uZGUgY29uIGVsIGNvbXBvbmVudGUgZGUgZXNjcml0dXJhIGFuYWzDrXRpY2E6IGNhbGlmaWNhZG8gZW50cmUgMCB5IDYgcHVudG9zLg0KDQotICoqVE9FRkwgU2NvcmUqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiByZWdpc3RyYSBlbCBwdW50YWplIHRvdGFsIFRPRUZMIChwcnVlYmEgZGUgaW5nbMOpcyBjb21vIGlkaW9tYSBleHRyYW5qZXJvKSBvYnRlbmlkbyBwb3IgZWwgZXN0dWRpYW50ZS4gVE9FRkwgZXMgdW4gY29tcG9uZW50ZSBjb23Dum4gZGVsIHByb2Nlc28gZGUgYWRtaXNpw7NuIGEgY29sZWdpb3MgbyB1bml2ZXJzaWRhZGVzIGVuIEVFLlVVLiBwb3IgcGFydGUgZGUgZXN0dWRpYW50ZXMgZXh0cmFuamVyb3MgcXVlIG1pZGUgbGFzIGNvbXBldGVuY2lhcyBlbiBjb21wcmVuc2nDs24gZXNjcml0YSwgY29tcHJlbnNpw7NuIG9yYWwsIGV4cHJlc2nDs24gb3JhbCB5IGV4cHJlc2nDs24gZXNjcml0YSwgZW4gdW5hIGVzY2FsYSBkZXNkZSAwIGhhc3RhIDEyMCBwdW50b3MuDQoNCi0gKipTT1AqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiByZWdpc3RyYSBlbCBwdW50YWplIHRvdGFsIFNPUCAoZW5zYXlvIGRlIGRlY2xhcmFjacOzbiBkZSBwcm9ww7NzaXRvcyBvIGRlIGFkbWlzacOzbikgb2J0ZW5pZG8gcG9yIGVsIGVzdHVkaWFudGUuIFNPUCBlcyB1biBjb21wb25lbnRlIGNvbcO6biBkZWwgcHJvY2VzbyBkZSBhZG1pc2nDs24gYSBjb2xlZ2lvcyBvIHVuaXZlcnNpZGFkZXMgZW4gRUUuVVUuIHF1ZSBjb25zaXN0ZSBlbiB1biBlbnNheW8gZGUgc29saWNpdHVkIGRlIGluZ3Jlc28gZXNjcml0byBwb3IgZWwgZXN0dWRpYW50ZSBlbiBlbCBjdWFsIGRlYmUgaGFjZXIgdW5hIGRlc2NyaXBjacOzbiBnZW5lcmFsIGRlIHF1acOpbiBlcywgZW4gcXVpw6luIHF1aWVyZSBjb252ZXJ0aXJzZSB5IGhhc3RhIHF1w6kgcHVudG8gZXN0w6EgcHJlcGFyYWRvIHBhcmEgc2VndWlyIHVuIGRldGVybWluYWRvIGN1cnNvIGVuIGxhIGluc3RpdHVjacOzbiBlZHVjYXRpdmEgYSBsYSBjdWFsIGFzcGlyYSBpbmdyZXNhci4gRXN0ZSBlbnNheW8gc2UgY2FsaWZpY2EgY29uIHVuIHB1bnRhamUgZW50cmUgMCB5IDUuDQoNCi0gKipMT1IqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiByZWdpc3RyYSBlbCBwdW50YWplIHRvdGFsIExPUiAoY2FydGEgZGUgcmVjb21lbmRhY2nDs24pIG9idGVuaWRvIHBvciBlbCBlc3R1ZGlhbnRlLiBMT1IgZXMgdW4gY29tcG9uZW50ZSBjb23Dum4gZGVsIHByb2Nlc28gZGUgYWRtaXNpw7NuIGEgY29sZWdpb3MgbyB1bml2ZXJzaWRhZGVzIGVuIEVFLlVVLiBxdWUgY29uc2lzdGUgZW4gdW5hIHJlY29tZW5kYWNpw7NuIGVzY3JpdGEsIGdlbmVyYWxtZW50ZSBwb3IgdW4gcHJvZmVzb3IsIGVuIGxhIGN1YWwgZWwgcmVkYWN0b3IgZXZhbMO6YSBsYXMgY3VhbGlkYWRlcywgY2FyYWN0ZXLDrXN0aWNhcyB5IGNhcGFjaWRhZGVzIGRlbCBlc3R1ZGlhbnRlIHJlY29tZW5kYWRvIGVuIHJlbGFjacOzbiBjb24gc3UgYXB0aXR1ZCBwYXJhIHNlZ3VpciB1biBjdXJzbyBlbiBsYSBpbnN0aXR1Y2nDs24gZWR1Y2F0aXZhIGEgbGEgY3VhbCBlbCBlc3R1ZGlhbnRlIGFzcGlyYSBhIGluZ3Jlc2FyLiBFc3RhIGNhcnRhIHNlIGNhbGlmaWNhIGNvbiB1biBwdW50YWplIGVudHJlIDAgeSA1Lg0KDQotICoqQ0dQQSoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IHJlZ2lzdHJhIGVsIHB1bnRhamUgdG90YWwgQ0dQQSAocHJvbWVkaW8gZGUgY2FsaWZpY2FjaW9uZXMgYWN1bXVsYXRpdm8pIG9idGVuaWRvIHBvciBlbCBlc3R1ZGlhbnRlLiBDR1BBIGVzIHVuIGNvbXBvbmVudGUgY29tw7puIGRlbCBwcm9jZXNvIGRlIGFkbWlzacOzbiBhIGNvbGVnaW9zIG8gdW5pdmVyc2lkYWRlcyBlbiBFRS5VVS4gcXVlIG1pZGUgZWwgZGVzZW1wZcOxbyBwcm9tZWRpbyBkZWwgZXN0dWRpYW50ZSBlbiBzdSBlc2NvbGFyaWRhZCBwcmV2aWEgYSBsYSBzb2xpY2l0dWQgZGUgaW5ncmVzbyBhIGxhIGluc3RpdHVjacOzbiBlZHVjYXRpdmEgc2lndWllbnRlIGRlIHN1IHByZWZlcmVuY2lhLiBFc3RlIHB1bnRhamUgc2UgbWlkZSBlbnRyZSAwIHkgNDsgc2luIGVtYmFyZ28sIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGZ1ZSBjb252ZXJ0aWRvIGVuIHVuYSBlc2NhbGEgZW50cmUgMCB5IDEwLg0KDQotICoqUmVzZWFyY2gqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiByZWdpc3RyYSBsYSBleHBlcmllbmNpYSBlbiBpbnZlc3RpZ2FjacOzbiBxdWUgcG9zZWUgZWwgZXN0dWRpYW50ZTogMSBjb3JyZXNwb25kZSBjb24gcXVlIGVsIGVzdHVkaWFudGUgYXJndW1lbnRhIGV4cGVyaWVuY2lhIGludmVzdGlnYXRpdmEsIDAgY29ycmVzcG9uZGUgY29uIHF1ZSBuby1hcmd1bWVudGEgZXhwZXJpZW5jaWEgaW52ZXN0aWdhdGl2YS4NCg0KLSAqKlVuaXZlcnNpdHkgUmF0aW5nKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKG9yZGVuYWRhKSk6IHJlZ2lzdHJhIHZhbG9yYWNpw7NuIGRlIGxhIHVuaXZlcnNpZGFkIGEgbGEgY3VhbCBhc3BpcmEgYSBpbmdyZXNhciBlbCBlc3R1ZGlhbnRlLiBFc3RhIHZhbG9yYWNpw7NuIHNlIGhhY2UgZW4gdW5hIGVzY2FsYSBlbnRyZSAxIHkgNSBlc3RyZWxsYXMsIGNpbmNvIGVzdHJlbGxhcyBpbmRpY2EgbGEgbWVqb3IgdmFsb3JhY2nDs24uDQoNCi0gKipDaGFuY2Ugb2YgQWRtaXQqKiAoY3VhbnRpdGF0aXZhOjpyYXrDs24pOiByZWdpc3RyYSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVsIGVzdHVkaWFudGUgc2VhIGFkbWl0aWRvIGVuIGxhIHVuaXZlcnNpZGFkIGRlIHN1IHByZWZlcmVuY2lhIGNvbiBiYXNlIGVuIGxvcyBkYXRvcyByZWdpc3RyYWRvcyBhIHN1IG5vbWJyZSwgc2Fsdm8gc3Ugc2V4by4gRXN0YSBwcm9icmFiaWxpZGFkIHNlIG1pZGUgZW50cmUgMCB5IDEuDQoNClBvciDDumx0aW1vLCBlcyBuZWNlc2FyaW8gYWNsYXJhciBxdWUgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgbG9zIHJlZ2lzdHJvcyBkZSBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcyBmdWVyb24gcmVlc2NyaXRvcywgc2Vnw7puIGxvcyBjYXNvcywgcG9yIG7Dum1lcm9zIGVudGVyb3MgcG9zaXRpdm9zLCBpbmNsdWlkbyBlbCBjZXJvLiBBc8OtLCBsb3Mgc2V4b3MgZW4gbGEgdmFyaWFibGUgKipHZW5kZXIqKiBmdWVyb24gcmVlc2NyaXRvcyBjb21vICoqMCoqOioqZmVtYWxlKiogeSAqKjEqKjoqKm1hbGUqKjsgZW4gKipSZXNlYXJjaCoqIGVsIGV2aWRlbmNpYXIgbyBuby1ldmlkZW5jaWFyIGludmVzdGlnYWNpb25lcyBmdWUgcmVlc2NyaXRvIGNvbW8gKiowKio6Kipuby1yZXNlYXJjaCoqIHkgKioxKio6KipyZXNlYXJjaCoqOyB5IGVuICoqVW5pdmVyc2l0eSBSYXRpbmcqKiBsYSB2YWxvcmFjacOzbiBkZSBsYSB1bml2ZXJzaWRhZCBmdWUgcmVlc2NyaXRhIGNvbW8gKioxKio6KipvbmVfc3RhcioqLCAqKjIqKjoqKnR3b19zdGFycyoqLCAqKjMqKjoqKnRocmVlX3N0YXJzKiosICoqNCoqOioqZm91cl9zdGFycyoqIHkgKio1Kio6KipmaXZlX3N0YXJzKiouDQoNCiMjIyMgRXN0cnVjdHVyYSBkZWwgQ29uanVudG8gZGUgRGF0b3MgSW5pY2lhbA0KYGBge3IgRXN0cnVjdHVyYV9Db25qdW50b19kZV9EYXRvc19JbmljaWFsLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN0cihBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsKQ0KYGBgDQoNCiMjIyMgQ29uanVudG8gZGUgRGF0b3MgSW5pY2lhbA0KYGBge3IgQ29uanVudG9fZGVfRGF0b3NfSW5pY2lhbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsDQpgYGANCg0KIyMjIyBFc3RydWN0dXJhIGRlbCBDb25qdW50byBkZSBEYXRvcyBSZWVzY3JpdG8NCmBgYHtyIEVzdHJ1Y3R1cmFfQ29uanVudG9fZGVfRGF0b3NfUmVlc2NyaXRvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN0cihBZG1pc3Npb25fRGF0YXNldCkNCmBgYA0KDQojIyMjIENvbmp1bnRvIGRlIERhdG9zIFJlZXNjcml0bw0KYGBge3IgQ29uanVudG9fZGVfRGF0b3NfUmVlc2NyaXRvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCkFkbWlzc2lvbl9EYXRhc2V0DQpgYGANCg0KIyMgKiozLiBFc3RpbWFjaW9uZXMgTXVsdGl2YXJpYWRhcyoqDQpDb21vIHNlIG1lbmNpb25hIGVuIFtAQU1FREFyaXN0aXphYmFsMjAxN10gbGEgZGUgbWVkaWEsIHZhcmlhbnphIHkgY292YXJpYW56YSBjb25mb3JtYW4gdW4gY29uanVudG8gZGUgbWVkaWRhcyBmdW5kYW1lbnRhbGVzIHBhcmEgZGVzY3JpYmlyIGRlc2NyaWJpciBlbCBjb21wb3J0YW1pZW50bwlwb3NpY2lvbmFsLCBkaXNwZXJzaXZvIHkgY29ycmVsYWNpb25hbCBkZQl2YXJpYWJsZXMJYWxlYXRvcmlhcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIHF1ZSBwb3NlZSBjaW5jbyB2YXJpYWJsZXMgYWxlYXRvcmlhcyBudW3DqXJpY2FzLCB5IHF1ZSBlc3TDoSByZXByZXNlbnRhZG8gbWF0cmljaWFsbWVudGUsIGVzdGltYSBsYXMgbWVkaWRhcyBhbnRlcmlvcmVzIGEgcGFydGlyIGRlIHZlY3RvcmVzIHkgbWF0cmljZXMgZW4gZWwgZXN0dWRpbyBkZXNjcmlwdGl2byBtdWx0aXZhcmlhYmxlLg0KDQpFbCB2ZWN0b3IgZGUgbWVkaWFzIGluZGljYSBlbCBjb21wb3J0YW1pZW50byBwb3NpY2lvbmFsIGVuIGVsIHNlbnRpZG8gZGUgdmFsb3IgZXNwZXJhZG8gbyBwdW50byBtZWRpbyBwYXJhIGNhZGEgdmFyaWFibGUgZW4gcmVsYWNpw7NuIGNvbiB0b2RvcyBzdXMgcmVnaXN0cm9zLiBMYSBtYXRyaXogZGUgdmFyaWFuemFzLWNvdmFyaWFuemFzIGVzdGltYSBsYXMgZGlzcGVyc2lvbmVzLCBlbiBzdSBkaWFnb25hbCBwcmluY2lwYWwsIGRlIGNhZGEgdmFyaWFibGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIHJlc3BlY3RvIGRlIGNhZGEgbWVkaWEgb2J0ZW5pZGEgZGVsIHZlY3RvciBkZSBtZWRpYXMuIEFkZW3DoXMsIHBvciBlbmNpbWEgbyBwb3IgZGViYWpvIGRlIGxhIGRpYWdvbmFsIHByaW5jaXBhbCwgc2UgZXN0aW1hbiBsYXMgY292YXJpYW56YXMgZW50cmUgbGFzIGNvbWJpbmFjaW9uZXMgZGUgbG9zIHBvc2libGVzIHBhcmVzIGRlIHZhcmlhYmxlcyBkZWwgY29uanVudG8gZGUgZGF0b3MuIFBhcmEgbcOhcyBkZXRhbGxlcyBzZSBwdWVkZSBjb25zdWx0YXIgYSBbQEFNRURBcmlzdGl6YWJhbDIwMTddLg0KDQpMbyBhbnRlcmlvciwgcGFyYSBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvLCBzZSBkZXNhcnJvbGxhIGVuIGxhIFtzZWNjacOzbiAzLjIuXSgjc2VjM18yKQ0KDQojIyMgMy4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBjYWxjdWxhcsOhbiBlIGludGVwcmV0YXLDoW4sIHBhcmEgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBlbCB2ZWN0b3IgZGUgbWVkaWFzLCBsYSBtYXRyaXogZGUgdmFyaWFuemFzLWNvdmFyaWFuemFzIHkgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMuIFNlIHJlY3VlcmRhIHF1ZSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMgKGVuIGVzY2FsYWRhIGRlIG1lZGljacOzbiBkZSByYXrDs24pIHNvbjogKipHUkUgU2NvcmUqKiwgKipUT0VGTCBTY29yZSoqLCAqKlNPUCoqLCAqKkxPUioqLCAqKkNHUEEqKiB5ICoqQ2hhbmNlIG9mIEFkbWl0KiouDQoNCjxhIG5hbWU9InNlYzNfMiI+PC9hPg0KDQojIyMgMy4yLiBEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBwZXN0YcOxYXMgbXVlc3RyYSBlbCBjw6FsY3VsbyBkZSBsb3Mgc2lndWllbnRlcyBvYmpldG9zOiAqKlZlY3RvciBkZSBNZWRpYXMqKiAkXGJhciB4JCwgKipNYXRyaXogZGUgVmFyaWFuemFzLUNvdmFyaWFuemFzKiogJFMkIHkgKipNYXRyaXogZGUgQ29ycmVsYWNpb25lcyoqICRSJC4NCg0KQ29uIGJhc2UgZW4gbGEgcGVzdGHDsWEgKipWZWN0b3IgZGUgTWVkaWFzIHkgQm94cGxvdHMqKiBzZSBwdWVkZSBkZXNjcmliaXIgcXVlIGVuIGdlbmVyYWwgbG9zIGRhdG9zIHJlZ2lzdHJhZG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyB0aWVuZGVuIGEgdGVuZXIgY29sYXMgaXpxdWllcmRhcyBlbiBzdSBkaXN0cmlidWNpb25lcywgYXPDrSwgbGFzIG1lZGlhcyBlc3RpbWFkYXMgdGllbmRlbiBhIHNlciBhbHRhcy4gQWRpY2lvbmFsbWVudGUsIGVuIHJlbGFjacOzbiBjb24gbGEgbWVkaWFuYSwgc29sbyBsYSB2YXJpYWJsZSAqKlNPUCoqIG11ZXN0cmEgdW4gc2VzZ28gbm90b3JpbyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyBkZW3DoXMuIEFkZW3DoXMsIHRvZG9zIGxvcyBjYXNvcyBhdMOtcGljb3Mgc29uIGRlIGV4dHJlbW8gaW5mZXJpb3IuIFNpIHNlIHJldmlzYW4gbG9zIHJhbmdvcyBkZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMgc2UgcHVlZGUgY29uc3RhdGFyIHF1ZSBsYXMgbWVkaWFzIHNvbiBhbHRhcyBjb21wcmFkYXMgY29uIGxvcyBleHRyZW1vcyBzdXBlcmlvcmVzIGRlIGNhZGEgcmFuZ28uDQoNCkNvbiBiYXNlIGVuIGxhIHBlc3Rhw7FhICoqTWF0cml6IGRlIFZhcmlhbnphcy1Db3ZhcmlhbnphcyoqIHNlIGludGVycHJldGEgcXVlLCBlbiBnZW5lcmFsLCB5IGNvbW8gc2UgZXNwZXJhIHF1ZSBwYXNlLCBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLCBlc3R1ZGlhZGFzIHBvciBwYXJlcywgdGllbmRlbiBhIHNlciBkZSBwcm9wb3JjaW9uYWxpZGFkIGRpcmVjdGEuIFBhcmEgZWwgY2Fzbywgc2UgcHVlZGVuIG9ic2VydmFyIGxhIGdyw6FmaWNhIG11bHRpdmFyaWFkYSBtb3N0cmFkYSBlbiBsYSBwZXN0YcOxYSAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbU0FdKiogZGUgbGEgW3NlY2Npw7NuIDQuMi5dKCNzZWM0XzIpDQoNCkNvbiBiYXNlIGVuIGxhIHBlc3Rhw7FhICoqTWF0cml6IGRlIENvcnJlbGFjaW9uZXMqKiB5IGFsIGNvbnNpZGVyYXIgbGEgKipNYXRyaXogZGUgVmFyaWFuemFzLUNvdmFyaWFuemFzKiogZXMgdmVyaWZpY2FibGUgcXVlIGxhIGludGVuc2lkYWQgZGUgbGFzIGNvcmVsYWNpb25lcyBlcyBtw6FzIGFsdGEgeSBzaWVtcHJlIHBvc2l0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXM6ICoqVE9FRkxfU2NvcmUqKiwgKipHUkVfU2NvcmUqKiwgKipDR1BBKiogeSAqKkNoYW5jZV9vZl9BZG1pdCoqLCBxdWUgZXMgZXNwZXJhZG8gZW4gcmVsYWNpw7NuIGNvbiBlbCBmZW7Ds21lbm8gZXN0dWRpYWRvLCBlc3RvIHNlIHB1ZWRlIHJldmlzYXIgY29uIG3DoXMgZGV0YWxsZXMgZW4gbGEgW3NlY2Npw7NuIDQuMi5dKCNzZWM0XzIpDQoNCiMjIyMgVmVjdG9yIGRlIE1lZGlhcyB5IEJveHBsb3RzDQpgYGB7ciBWZWN0b3JfZGVfTWVkaWFzX3lfQm94cGxvdHMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYXBwbHkoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgMiwgbWVhbikNCkFkbWlzc2lvbl9EYXRhc2V0X1JlZHVjaWRvID0gQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXQ0KcGFyKG1mcm93ID0gYygxLCBuY29sKEFkbWlzc2lvbl9EYXRhc2V0X1JlZHVjaWRvKSkpDQppbnZpc2libGUobGFwcGx5KDE6bmNvbChBZG1pc3Npb25fRGF0YXNldF9SZWR1Y2lkbyksIGZ1bmN0aW9uKGkpIGJveHBsb3QoQWRtaXNzaW9uX0RhdGFzZXRfUmVkdWNpZG9bLCBpXSkpKQ0KYGBgDQoNCiMjIyMgTWF0cml6IGRlIFZhcmlhbnphcy1Db3Zhcmlhbnphcw0KYGBge3IgbWF0cml6X2RlX1Zhcmlhbnphc19Db3ZhcmlhbnphcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpyb3VuZChjb3YoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSksMikNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBtYXRyaXpfZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpyb3VuZChjb3IoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSksMikNCmBgYA0KDQojIyAqKjQuIEdyw6FmaWNhcyBNdWx0aXZhcmlhZGFzKioNCkVuIGxhIGd1w61hIGRlIGNsYXNlIGRlIFtAQU1FREFyaXN0aXphYmFsMjAxN10gc2UgbWVuY2lvbmEgcXVlLCBlbiBnZW5lcmFsLCBsb3MgZ3LDoWZpY29zIG11bHRpdmFyaWFkb3MgY3VtcGxlbiBkb3Mgb2JqZXRpdm9zIGVzZW5jaWFsZXM6IHByaW1lcm8sIGF5dWRhbiBhIGNvbXBhcmFyCWVsCWNvbXBvcnRhbWllbnRvCWRlCXBvYmxhY2lvbmVzIGRlIGVzdHVkaW8gY29uIGJhc2UgZW4gdmFyaWFibGVzIGNhdGVnw7NyaWNhcyB5IHN1YXZpemFuIGxhIGNvbXByZW5zacOzbiBkZSBsYSBlc3RydWN0dXJhIGRlIGNvcnJlbGFjacOzbiBlbnRyZQl2YXJpYXMgdmFyaWFibGVzLiBFbiBlc3RlIHNlbnRpZG8sIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gdGVuZHLDoSBhcG95byBkZXNjcml0aXZvIGdyw6FmaWNvIGEgdHJhdsOpcyBkZSB0cmVzIGRpYWdyYW1hczogdW5vIGNvbmp1bnRvIHF1ZSBpbnRlZ3JhIGRpc3BlcnNpw7NuLCBkaXN0cmlidWNpw7NuIHkgY29ycmVsYWNpb25lczsgb3RybyBiYXNhZG8gZW4gbGEgcmVuZGVyaXphY2nDs24gZGUgcG9sw61nb25vcywgeSBwb3Igw7psdGltbywgdW5vIHF1ZSByZWN1cnJlIGEgbGFzIGNhcmFzIGRlIENoZXJub2ZmLg0KDQojIyMgNC4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBjYWxjdWxhcsOhbiBlIGludGVwcmV0YXLDoW4sIHBhcmEgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBsYXMgZ3LDoWZpY2FzIG11bHRpdmFyaWFkYXMgZGUgZGlhZ3JhbWEgZGUgY29ycmVsYWNpb25lcywgbWF0cml6IGRlIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuLCBkaWFncmFtYSBkZSBlc3RyZWxsYXMgeSBjYXJhcyBkZSBDaGVybm9mZi4gU2UgcmVjdWVyZGEgcXVlIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyAoZW4gZXNjYWxhZGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgc29uOiAqKkdSRSBTY29yZSoqLCAqKlRPRUZMIFNjb3JlKiosICoqU09QKiosICoqTE9SKiosICoqQ0dQQSoqIHkgKipDaGFuY2Ugb2YgQWRtaXQqKi4NCg0KPGEgbmFtZT0ic2VjNF8yIj48L2E+DQoNCiMjIyA0LjIuIERlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBwZXN0YcOxYXMgbXVlc3RyYSBsYXMgZ3LDoWZpY2FzIG11bHRpdmFyaWFkYXMgZGU6ICoqRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzKiogKHNpbiBhZ3J1cGFjacOzbiBTQSB5IGNvbiBhZ3J1cGFjacOzbiBDQSAoY29uIGJhc2UgZW4gbGFzIHRyZXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhczogR2VuZGVyOkdFLCBSZXNlYXJjaDpSRSwgVW5pdmVyc2l0eV9SYXRpbmc6VVIpKSwgKipEaWFncmFtYSBkZSBFc3RyZWxsYXMqKiB5ICoqQ2FyYXMgZGUgQ2hlcm5vZmYqKi4NCg0KQ29uIGJhc2UgZW4gbGEgcGVzdGHDsWEgKipEaWFncmFtYSBDb25qdW50byBkZSBEaXNwZXJzacOzbiwgRGlzdHJpYnVjacOzbiB5IENvcnJlbGFjaW9uZXMgW1NBXSoqIHNlIHB1ZWRlIGRlc2NyaWJpciBxdWUgbGFzIGNvcnJlbGFjaW9uZXMgbcOhcyBhbHRhcywgbWF5b3JlcyBxdWUgJDAuOCQsIHNlIGRhbiBlbnRyZSB2YXJpYWJsZXMgZXNwZXJhZGFzIGNvbW86ICoqVE9FRkxfU2NvcmUqKiwgKipHUkVfU2NvcmUqKiwgKipDR1BBKiogeSAqKkNoYW5jZV9vZl9BZG1pdCoqLiBFc3RhcyB2YXJpYWJsZXMsIHNlZ8O6biBsYXMgZGVmaW5pY2lvbmVzIGRhZGFzIGVuIGxhIFtzZWNjacOzbiAyXSgjc2VjMikgZGUgZGVzY3JpcGNpw7NuIGRlIGRhdG9zLCBzb24gbnVjbGVhcmVzIGVuIGVsIGZlbsOzbWVubyBlc3R1ZGlhZG8sIHBvcnF1ZSBlc3TDoW4gaW52b2x1Y3JhZGFzIGNvbiBlbCBoaXN0b3JpYWwgZGUgcmVuZGltaWVudG8gYWNhZMOpbWljbyBkZWwgZXN0dWRpYW50ZSwgc3UgZGVzZW1wZcOxbyBlbiBsYSBwcnVlYmEgZGUgaW5ncmVzbyBhIGxhIHVuaXZlcnNpZGFkLCBzdSBuaXZlbCBkZSBkb21pbmlvIGNlcnRpZmljYWRvIGRlbCBpZGlvbWEgaW5nbMOpcyB5IHN1cyDDrW5kaWNlIGRlIHByb2JhYmlsaWRhZCBkZSBpbmdyZXNvIGEgbGEgdW5pdmVyc2lkYWQgYSBsYSBjdWFsIGFzcGlyYS4gU2luIGVtYmFyZ28sIG5pbmd1bmEgZGUgZWxsYXMgZXMgZGVzY29sbGFudGVtZW50ZSBleHBsaWNhdGl2YS4gUGFyYSBtw6FzIGRldGFsbGVzIHB1ZWRlIGNvbnN1bHRhcnNlIGVsIHRyYWJham8gZGUgYW7DoWxpc2lzIGRlIHJlZ3JyZXNpw7NuIGZvcm11bGFkbyBzb2JyZSBlbCBtaXNtbyBjb25qdW50byBkZSBkYXRvcyBhIHRyYXbDqXMgZGU6IGh0dHBzOi8vcnB1YnMuY29tL2dsaWJyZXJvc2wvQXBwbGllZC1TdGF0aXN0aWNzLUZVTEwuDQoNCkNvbXBsZW1lbnRhcmlhbWVudGUsIGNvbiBiYXNlIGVuIGxhcyBwZXN0YcOxYXMgKipEaWFncmFtYSBDb25qdW50byBkZSBEaXNwZXJzacOzbiwgRGlzdHJpYnVjacOzbiB5IENvcnJlbGFjaW9uZXMqKiBlbiBzdXMgdmVyc2lvbmVzIGJhc2FkYXMgZW4gZ3J1cG9zIGEgcGFydGlyIGRlIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzOiAqKkdlbmRlcioqLCAqKlJlc2VhcmNoKiogeSAqKlVuaXZlcnNpdHlfUmF0aW5nKiosIHNlIHB1ZWRlIGFwcmVjaWFyIHF1ZSBjb21wYXJhdGl2YW1lbnRlIGxhIGRpZmVyZW5jaWFjacOzbiBiYXNhZGEgZW4gKipHZW5kZXIqKiBubyBtdWVzdHJhIHJlbGV2YW5jaWEgcGFyYSBlbGV2YXIgbGEgcHJvYmFiaWxpZGFkIGRlIGFjY2VzbyBhIGxhIHVuaXZlcnNpZGFkIGRlIHN1IGVsZWNjacOzbiwgY29udHJhcmlvIGEgbG8gcXVlIHN1Y2VkZSBjb24gbGEgdmFyaWFibGUgYWdydXBhZG9yYSAqKlJlc2VhcmNoKiogcXVlIG11ZXN0cmEgZGlmZXJlbmNpYWRhbWVudGUgbG8gY29udHJhcmlvLiBFcyBkZWNpciwgcXVlIHVuIGVzdHVkaWFudGUgcGVydGVuZXpjYSBhbCBncnVwbyBkZSBhcXVlbGxvcyBxdWUgZXZpZGVuY2lhIHRyYWJham8gZW4gaW52ZXN0aWdhY2nDs24gYWwgbW9tZW50byBkZSBwcmVzZW50YXIgc3Ugc29saWNpdHVkIGRlIGFjY2VzbywgcmVzdWx0YSBwYXJhIMOpbCBlbiB1bmEgY2FyYWN0ZXLDrXN0aWNhIHNpZ25pZmljYXRpdmFtZW50ZSBhIGZhdm9yIGRlIHN1cyBwcmV0ZW5zaW9uZXMuIFBvciBvdHJvIGxhZG8sIGxhIHZhcmlhYmxlIGNsYXNpZmljYWRvcmEgKipVbml2ZXJzaXR5X1JhdGluZyoqLCBxdWUgYXBvcnRhIGNpbmNvIGdydXBvcywgbXVlc3RyYSBxdWUgbGFzIHVuaXZlcnNpZGFkZXMgZGUgZG9zIHkgY3VhdHJvIGVzdHJlbGxhcyBlbiB0b2RvcyBsb3MgY2Fzb3MgdmlzdWFsaXphZG9zIGVuIGVsIGRpYWdyYW1hIHNvbiBzaWduaWZpY2F0aXZhcyBhIG5pdmVsIGRlIGNvcnJlbGFjacOzbiwgcGVybywgY29tbyBlcyBlc3BlcmFkbywgbGFzIGRlIG1lam9yIHJhdGluZywgYXRyYWVuIGEgbG9zIG1lam9yZXMgdGFsZW50b3MuDQoNCkNvbiBiYXNlIGVuIGxhIHBlc3Rhw7FhICoqRGlhZ3JhbWEgZGUgRXN0cmVsbGFzKiogc2UgaW50ZXJwcmV0YSBxdWUgaGF5IHVuYSB2YXJpZWRhZCBub3RvcmlhIGRlIGVzdHVkaWFudGVzIGVuIHTDqXJtaW5vcyBkZSBkZXNlbXBlw7FvcyBhc29jaWFkb3MgY29uIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBlc3R1ZGlhZGFzLCBpbmNsdXNvIGNvbiBsYSBxdWUgbWlkZSBlbCBleGFtZW4gZGUgcHJvZmljaWVuY2lhIGVuIGxlbmd1YSBleHRyYW5qZXJhLCBwYXJhIGVsIGNhc28gaW5nbMOpczogKipUT0VGTF9TY29yZSoqLiBQZXJvLCB0YW1iacOpbiBlcyBub3RvcmlhIGxhIHByZXNlbmNpYSBkZSBncnVwb3MgZGUgZXN0dWRpYW50ZXMgY29uIGRlc2VtcGXDsW9zIGFwcm94aW1hZGFtZW50ZSBob21vZ8OpbmVvcyBlbiB0b2RhcyBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMsIGF1bnF1ZSBzdXMgZXNjYWxhcyBkZSBkZXNlbXBlw7FvIHZhcmlhbi4NCg0KQ29tcGxlbWVudGFyaWFtZW50ZSBhIGxvcyBkaWFncmFtYXMgZGUgZXN0cmVsbGFzLCBsYSBwZXN0YcOxYSAqKkNhcmFzIGRlIENoZXJub2ZmKiogbXVlc3RyYSBxdWUgbGEgdmFyaWVkYWQgZGUgZXN0dWRpYW50ZXMgZXMgc2Vuc2libGUgZGUgZXN0YWJsZWNlci4gQ29uIHJlbGF0aXZhIGNsYXJpZGFkLCBsYXMgKipDYXJhcyBkZSBDaGVybm9mZioqIG7Dum1lcm8gMSwgMTAsIDIxIHkgOCwgMTksIDIyLCBwdWVkZW4gY29uZm9ybWFyIHVuIHBhciBkZSBncnVwb3MgZGUgZXN0dWRpYW50ZXMgcXVlIG11ZXN0cmFuIGRlc2VtcGXDsW9zIHNpZ25pZmljYXRpdm9zIGVuIGxhcyB2YXJpYWJsZXMgbWVkaWRhcywgYXVucXVlIGNvbiBjYW1iaW9zIGRlIGVzY2FsYTsgZXMgZGVjaXIsIGxvcyBkZWwgc2VndW5kbyBncnVwbyBzZSBkZXNlbXBlw7FhbiBtZWpvciBxdWUgbG9zIGRlbCBwcmltZXJvIGNvbnNpZGVyYW5kbyB0b2RhcyBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMuIEVzdG8gY29tcGFnaW5hIGNvbiBsbyBtb3N0cmFkbyBlbiBlbCAqKkRpYWdyYW1hIGRlIEVzdHJlbGxhcyoqLg0KDQpQb3Igw7psdGltbywgZXMgcmVsZXZhbnRlIG1lbmNpb25hciBxdWUgbGFzIGV2aWRlbmNpYXMgZGVzY3JpcHRpdmFzIGV4cHVlc3RhcyBlbiBlc3RlIGFwYXJ0YWRvIGVzdMOpbiBlbiBjb250cmEgZGUgY29uc2lkZXJhciBxdWUgZWwgY29uanVudG8gZGUgZGF0b3MgbGltaXRhZG8gYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMgdGVuZ2EgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gRXN0byBzZSBlc3R1ZGlhIGVuIGxhIFtzZWNjacOzbiA1XSgjc2VjNSkuDQoNCiMjIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtTQV0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19TQSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0pDQpgYGANCg0KIyMjIyBEaWFncmFtYSBDb25qdW50byBkZSBEaXNwZXJzacOzbiwgRGlzdHJpYnVjacOzbiB5IENvcnJlbGFjaW9uZXMgW0NBOkdFXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0dFLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoQWRtaXNzaW9uX0RhdGFzZXRfSW5pdGlhbCwgY29sdW1ucyA9IGMoMzo3LDEwKSwgYWVzKGNvbG9yID0gR2VuZGVyLCBhbHBoYSA9IDAuNSksIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgiY29yIiwgc2l6ZSA9IDIuNSkpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtDQTpSRV0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9SRSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWwsIGNvbHVtbnMgPSBjKDM6NywxMCksIGFlcyhjb2xvciA9IFJlc2VhcmNoLCBhbHBoYSA9IDAuNSksIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgiY29yIiwgc2l6ZSA9IDIuNSkpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtDQTpVUl0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9VUiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWwsIGNvbHVtbnMgPSBjKDM6NywxMCksIGFlcyhjb2xvciA9IFVuaXZlcnNpdHlfUmF0aW5nLCBhbHBoYSA9IDAuNSksIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgiY29yIiwgc2l6ZSA9IDIuNSkpKQ0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzDQpgYGB7ciBkaWFncmFtYV9kZV9Fc3RyZWxsYXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KQWRtaXNzaW9uX0RhdGFzZXRfTXVlc3RyZWFkbyA9IEFkbWlzc2lvbl9EYXRhc2V0W3NhbXBsZSgxOm5yb3coQWRtaXNzaW9uX0RhdGFzZXQpLDIzKSwtYygxLDIsOCw5KV0NCnN0YXJzKEFkbWlzc2lvbl9EYXRhc2V0X011ZXN0cmVhZG8sIGxlbiA9IDEsIGNleCA9IDAuNCwga2V5LmxvYyA9IGMoMTAsIDIpLCBkcmF3LnNlZ21lbnRzID0gVFJVRSkNCmBgYA0KDQojIyMjIENhcmFzIGRlIENoZXJub2ZmDQpgYGB7ciBjYXJhc19kZV9DaGVybm9mZiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjgpDQpBZG1pc3Npb25fRGF0YXNldF9NdWVzdHJlYWRvID0gQWRtaXNzaW9uX0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhBZG1pc3Npb25fRGF0YXNldCksMjMpLC1jKDEsMiw4LDkpXQ0KZmFjZXMoQWRtaXNzaW9uX0RhdGFzZXRfTXVlc3RyZWFkbykNCmBgYA0KDQo8YSBuYW1lPSJzZWM1Ij48L2E+DQoNCiMjICoqNS4gTm9ybWFsaWRhZCBNdWx0aXZhcmlhZGEqKg0KQ29tbyBtZW5jaW9uYSBbQENQRU1Qb3JyYXMyMDE2XSBwYXJhIGluZGFnYXIgbyBlc3RhYmxlY2VyIGVsIHRpcG8gZGUgZGlzdHJpYnVjacOzbiBtdWx0aXZhcmlhZGEgZGUgdW4gY29uanVudG8gZGUgZGF0b3Mgc2UgcHVlZGUgcmVjdXJyaXIgYSBwcm9jZWRpbWllbnRvcyBkZXNjcmlwdGl2b3MsIGNvbW8gbG9zIGdyw6FmaWNvcywgbyBhIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMsIGNvbW8gbGFzIHBydWViYXMgZXN0YWTDrXN0aWNhcy4gRW4gZXN0ZSBzZW50aWRvLCBzZSBhbGNhbnphIGdlbmVyYWxpemFjacOzbiBkZSByZXN1bHRhZG9zIGFsIHVzYXIgbGFzIGVzdG9zIMO6bHRpbW9zLCBzaSBiaWVuIGxvcyBwcmltZXJvcyBhcG95YW4gYSBsYXMgaW50ZXJwcmV0YWNpb25lcy4NCg0KRW4gZXN0ZSBhcGFydGFkbyBzZSBjb250ZW1wbGEgZWwgdXNvIGRlIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMgcGFyYSBkZXRlcm1pbmFyIHNpIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8sIGVuIHJlbGFjacOzbiBjb24gc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBzZSBkaXN0cmlidXllIG5vcm1hbCBtdWx0aXZhcmlhZG8gKEROTSkuIExhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIChQTk0pIGEgbGFzIHF1ZSBzZXLDoSBzb21ldGlkbyBzb246IE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLiBQYXJhIGVzdGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBsb3MgdGVzdCBvYmVkZWNlbiBhIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSA9IDAuMDUkIHkgYSBsYXMgaGlww7N0ZXNpczokJEhfMDogXHRleHQge0xhcyB2YXJpYWJsZXMgdGllbmVuIHVuYSBETk19JCQgJCRIXzE6IFx0ZXh0IHtMYXMgdmFyaWFibGVzIE5PIHRpZW5lbiB1bmEgRE5NfSQkIA0KDQpMYSBwcnVlYmEgZGUgTWFyZGlhIHNlIGJhc2EgZW4gZXh0ZW5zaW9uZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzLCBlbCBjdWFkcmFkbyBkZSBsYSBkaXN0YW5jaWEgZGUgTWFoYWxhbm9iaXMsIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyAkcCQgcG9yIHRyYXRhciB5IGxhIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyAkbiQuIEFkZW3DoXMsIGNvbnNpZGVyYSBxdWUgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBwYXJhIGxhIGFzaW1ldHLDrWEgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQgeSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgY3VydG9zaXMgc2UgZGlzdGlyYnV5ZSBhcHJveGltYWRhbWVudGUgbm9ybWFsLiBMb3MgZGV0YWxsZXMgc29icmUgbG9zIHBhcsOhbWV0cm9zIGRlIGxhcyBkaXN0cmlidWNpb25lcyBwdWVkZW4gY29uc3VsdGFyc2UgZW4gZWwgdHJhYmFqbyBkZSBbQENQRU1Qb3JyYXMyMDE2XS4NCg0KTGEgcHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIgc2UgYmFzYSBlbiBsYSBkaXN0YW5jaWEgZnVuY2lvbmFsLCBkYWRvIHF1ZSBzaSBlbCBjb25qdW50byBkZSBkYXRvcyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHNlIGRpc3RyaWJ1eWUgYXByb3hpbWFkYW1lbnRlIGNvbW8gdW5hIGxvZ25vcm1hbCwgY3V5b3MgcGFyw6FtZXRyb3MgZGUgbWVkaWEgJFxtdSQgeSB2YXJpYW56YSAkXHNpZ21hXjIkIHB1ZWRlbiBzZXIgY29uc3VsdGFkb3MgZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNCkxhIHBydWViYSBkZSBEb29ybmlrLUhhbnNlbiBlc3TDoSBiYXNhZGEgZW4gbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIHF1ZSBzZSB0cmFuc2Zvcm1hIHBhcmEgZ2FyYW50aXphciBsYSBpbmRlcGVuZGVuY2lhLiBFcyBjb25zaWRlcmFkYSBtw6FzIHBvdGVudGUgcXVlIGxhIHBydWViYSBkZSBTaGFwaXJvLVdpbGsgcGFyYSBjYXNvcyBtdWx0aXZhcmlhZG9zLiBTdSBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzdMOhIGRlZmluaWRvIGNvbW8gbGEgc3VtYSBkZSBsYXMgdHJhbnNmb3JtYWNpb25lcyBhbCBjdWFkcmFkbyBkZSBsYSBhc2ltZXRyw61hIHkgbGEgY3VydG9zaXMsIHkgc2lndWUsIGFwcm94aW1hZGFtZW50ZSwgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQuIExvcyBkZXRhbGxlcyBkZSBsYSBwcnVlYmEgcHVlZGVuIHNlciBjb25zdWx0YWRvcyBlbiBbQE9UVU1ORG9vcm5pa19IYW5zZW4yMDA4XS4NCg0KTGEgcHJ1ZWJhIGRlIFJveXN0b24gcmVjdXJyZSBhIGxhcyBwcnVlYmFzIFNoYXBpcm8tV2lsayBvIFNoYXBpcm8tRnJhbmNpYSBwYXJhIHByb2JhciBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gQXPDrSwgc2kgIGxhIGN1cnRvc2lzIGVzIG1heW9yIHF1ZSAzLCBsYSBwcnVlYmEgZGUgUm95c3RvbiB1c2EgU2hhcGlyby1GcmFuY2lhIHBhcmEgZGlzdHJpYnVjaW9uZXMgbGVwdG9jdXJ0aWNhcy4gTWllbnRyYXMgcXVlIHBhcmEgZGlzdHJpYnVjaW9uZXMgcGxhdGljdXJ0aWNhcyB1c2EgU2hhcGlyby1XaWxrLiBFbiBlbGxhIGxvcyBwYXLDoW1ldHJvcyBzb24gb2J0ZW5pZG9zIHBvciBhcHJveGltYWNpb25lcyBwb2xpbm9taWFsZXMsIGVzdG8gcHVlZGUgc2VyIGNvbnN1bHRhZG8gZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNCiMjIyA1LjEuIFBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hDQpDb24gYmFzZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSBbc2VjY2nDs24gMl0oI3NlYzIpIHNlIGhhcsOhIHVuYSBwcnVlYmEgZXN0YWTDrXN0aWNhIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBjb24gdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAkXGFscGhhPTAuMDUkLCBwYXJhIGVzdGFibGVjZXIgc2kgc3VzIGRhdG9zIG3DqXRyaWNvcyBwcm92aWVuZW4gZGUgdW5hIHBvYmxhY2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gU2UgcmVjdWVyZGEgcXVlIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgKGVuIGVzY2FsYWRhIGRlIG1lZGljacOzbiBkZSByYXrDs24pIHNvbjogKipHUkUgU2NvcmUqKiwgKipUT0VGTCBTY29yZSoqLCAqKlNPUCoqLCAqKkxPUioqLCAqKkNHUEEqKiB5ICoqQ2hhbmNlIG9mIEFkbWl0KiouDQoNCiMjIyA1LjIuIERlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBwZXN0YcOxYXMgbXVlc3RyYSBxdWUgZWwgY29uanVudG8gZGUgZGF0b3MsIGVuIHJlbGFjacOzbiBjb24gc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBubyBzZSBkaXN0cmlidXllIG5vcm1hbCBtdWx0aXZhcmlhZG8uIEVuIHBhcnRpY3VsYXI6DQoNCkxhICoqUE5NIGRlIE1hcmRpYSoqIGVzdGFibGVjZSBxdWUgc2kgYW1iYXMgcHJ1ZWJhcyAocGFyYSBhc2ltZXRyw61hIHkgY3VydG9zaXMpIGluZGljYW4gdW5hIG5vcm1hbGlkYWQgbXVsdGl2YXJpYW50ZSwgbG9zIGRhdG9zIHNpZ3VlbiB1bmEgRE5NIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhICRcYWxwaGE9MC4wNSQ7IHNpbiBlbWJhcmdvLCBlbCBjYXNvIHRyYXRhZG8gZXMgY29udHJhcmlvIGEgZXN0by4gT2Jzw6lydmVzZSBhIHRyYXbDqXMgZGUgbGEgcGVzdGHDsWEgKipQTk0gTWFyZGlhKiogcXVlIGxvcyAkcC12YWx1ZSQgcGFyYSBsYSBhc2ltZXRyw61hIChTa2V3bmVzcykgeSBjdXJ0b3JpcyAoS3VydG9zaXMpIHNvbiBtYXlvcmVzIHF1ZSBlbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhLiBQb3IgbG8gdGFudG8sIGxhcyBldmlkZW5jaWFzIG5vIGFwb3lhbiB1bmEgaGlww7N0ZXNpcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBwYXJhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIHJlc3RyaW5naWRvIGEgc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLg0KDQpMYSAqKlBOTSBkZSBQTk0gSGVuemUtWmlya2xlcioqIGVzdGFibGVjZSBxdWUgZWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSBubyBzZSBkaXN0cmlidXllIGFwcm94aW1hZGFtZW50ZSBjb21vIGxvZ25vcm1hbCBkYWRvIHF1ZSBzdSAkcC12YWx1ZSQgZXMgbWVub3IgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYT0wLjA1JCwgb2Jzw6lydmVzZSBlc3RvIGEgdHJhdsOpcyBkZSBsYSBwZXN0YcOxYSAqKlBOTSBIZW56ZS1aaXJrbGVyKiouIEFzw60sIHBvciBjb250cmFycmVjw61wcm9jbyBkZSBsYSBpbXBsaWNhY2nDs24gZm9ybXVsYWRhIGVuIGxhIGRlc2NyaXBjacOzbiBkZSBsYSBwcnVlYmEgZW4gbGEgW3NlY2Npw7NuIDVdKCNzZWM1KSwgZWwgY29uanVudG8gZGUgZGF0b3Mgbm8gZXN0w6EgYXBveWFkbyBwb3IgbGFzIGV2aWRlbmNpYXMgcGFyYSBzZWd1aXIgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4NCg0KTGEgKipQTk0gZGUgRG9vcm5pay1IYW5zZW4qKiBlc3RhYmxlY2UgcXVlIHN1IGVzdGFkw61zdGljbyBkZSBwcnVlYmEgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gYXByb3hpbWFkYW1lbnRlICRcY2hpXjIkIGRhZG8gcXVlIHN1ICRwLXZhbHVlJCBlcyBtZW5vciBxdWUgZWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAkXGFscGhhPTAuMDUkLCBvYnPDqXJ2ZXNlIGVzdG8gYSB0cmF2w6lzIGRlIGxhIHBlc3Rhw7FhICoqUE5NIERvb3JuaWstSGFuc2VuKiouIFBvciBsbyB0YW50bywgbGFzIGV2aWRlbmNpYXMgZXN0w6FuIGxlam9zIGRlIGFwb3lhciBxdWUgZWwgY29uanVudG8gZGUgZGF0b3Mgc2lndWUgdW5hIEROTS4NCg0KTGEgKipQTk0gZGUgUm95c3RvbioqIGVzdGFibGVjZSBxdWUgZWwgY29uanVudG8gZGUgZGF0b3MgcmVkdWNpZG8gYSBzdXMgdmFyaWFibGVzIG51bcOpcmljYXMgbm8gc2lndWUgdW5hIEROTSwgZGFkbyBxdWUgc3UgJHAtdmFsdWUkIGVzIG1lbm9yIHF1ZSBlbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhICRcYWxwaGE9MC4wNSQuIE9ic8OpcnZlc2UgZXN0byBhIHRyYXbDqXMgZGUgbGEgcGVzdGHDsWEgKipQTk0gUm95c3RvbioqLg0KDQpFbiBnZW5lcmFsLCBwdWRvIGNvbnN0YXRhcnNlIHF1ZSBwYXJhIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYT0wLjA1JCBlbCBjb25qdW50byBkZSBkYXRvcyByZWR1Y2lkbyBhIHN1cyB2YXJpYWJscyBudW3DqXJpY2FzIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEuDQoNCiMjIyMgUE5NIE1hcmRpYQ0KYGBge3IgUE5NX01hcmRpYSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbXZuVGVzdD0ibWFyZGlhIikNCmBgYA0KDQojIyMjIFBOTSBIZW56ZS1aaXJrbGVyDQpgYGB7ciBQTk1fSGVuemVfWmlya2xlciwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbXZuVGVzdD0iaHoiKQ0KYGBgDQoNCiMjIyMgUE5NIERvb3JuaWstSGFuc2VuDQpgYGB7ciBQTk1fRG9vcm5pa19IYW5zZW4sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KbXZuKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIG12blRlc3Q9ImRoIikNCmBgYA0KDQojIyMjIFBOTSBSb3lzdG9uDQpgYGB7ciBQTk1fUm95c3RvbiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbXZuVGVzdD0icm95c3RvbiIpDQpgYGANCg0KIyMgKipPYmpldGl2byB5IEFub3RhY2lvbmVzIFtFdGFwYSAyXSoqDQpFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBlc3RhIHNlZ3VuZGEgZXRhcGEgZGUgZXN0dWRpbyBtb3N0cmFyw6EgY8OhbGN1bG9zLCB2aXN1YWxpemFjaW9uZXMgZSBpbnRlcnByZXRhY2lvbmVzIGNvbiBiYXNlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIHRyYXRhZG8gZW4gbGEgRXRhcGEgMSwgcGVybyBhaG9yYSBkZXNkZSB1biBlbmZvcXVlIGRlIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzb2JyZSBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMsIHF1ZSBpbmNsdWlyw6E6IHNlbGVjY2nDs24sIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpw7NuLCBjb250cmlidWNpb25lcyBlIGludGVycHJldGFjacOzbi4NCg0KUmVjdcOpcmRlc2UgcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gZXMgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSB5IGxvcyByZWZlcmVudGVzIHRlw7NyaWNvcyBlbiBsYSBbc2VjY2nDs24gMV0oI3NlYzEpLg0KDQpQb3Igw7psdGltbywgZXN0ZSB0cmFiYWpvIGZ1ZSBwcm9jZXNhZG8gY29uIGByIFIudmVyc2lvbi5zdHJpbmdgIG1lZGlhZG8gcG9yIFJTdHVkaW8gMjAyMi4xMi4wIEJ1aWxkIDM1MyBlbiB1bmEgcGxhdGFmb3JtYSB4ODZfNjQtdzY0LW1pbmd3MzIuIEFkZW3DoXMsIHBvciBzdSBuYXR1cmFsZXphIGRlIHB1YmxpY2FjacOzbiBlbiBsw61uZWEgeSBwYXJhIGN1bXBsaXIgY29uIGVsIHJlcXVpc2l0byB0ZW1wb3JhbCBkZSBlbnRyZWdhLCBzZXLDoSBhY3R1YWxpemFkbywgY29tbyBtw6F4aW1vLCBoYXN0YSBsYXMgMTE6NTkgcC5tLiBkZWwgZG9taW5nbyAyNiBkZSBmZWJyZXJvIGRlIDIwMjMuDQoNCjxhIG5hbWU9InNlYzciPjwvYT4NCg0KIyMgKio3LiBTZWxlY2Npw7NuIGRlIENvbXBvbmVudGVzKioNCkNvbW8gZXMgbWVuY2lvbmFkbyBlbiBlbCB0cmFiYWpvIGRlIFtAQUVETURpYXotTW9yYWxlczFlZF0gZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChlbiBhZGVsYW50ZSBBQ1ApIHJlZXN0cnVjdHVyYSB1biBjb25qdW50byBkZSBkYXRvcyBtdWx0aXZhcmlhZG8gYSB0cmF2w6lzIGRlIGxhIHJlZHVjY2nDs24gZGUgbGEgY2FudGlkYWQgZGUgc3VzIHZhcmlhYmxlcywgZW4gY3V5byB0cmFuc2ZvbmRvIGVzIGlubmVjZXNhcmlvIGFzdW1pciBuaW5ndW5hIGRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkIGRlIGVsbGFzLiBFc3RhIHJlZHVjY2nDs24gZXMgbG9ncmFkYSBhIHRyYXbDqXMgZGUgY29tYmluYWNpb25lcyBsaW5lYWxlcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMsIHF1ZSBkZWJlcsOhbiBjb250ZW5lciBsYSBtYXlvciB2YXJpYWJpbGlkYWQgcG9zaWJsZSBwcmVzZW50ZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBBQ1AgbG9ncmEgY3JlYXIgbnVldmFzIHZhcmlhYmxlcywgY29ub2NpZGFzIGNvbW8gY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIHF1ZSBwb3NlZW4gY2FyYWN0ZXLDrXN0aWNhcyBlc3RhZMOtc3RpY2FzIGRlIGluZGVwZW5kZW5jaWEgKGNvbiBiYXNlIGVuIGVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQpIHkgbm8gY29ycmVsYWNpw7NuLg0KDQpFbCBBQ1Agc2UgbG9ncmEgYSBsbyBsYXJnbyBkZSBsYXMgc2lndWllbnRlcyBmYXNlczogZ2VuZXJhY2nDs24gZGUgbnVldmFzIHZhcmlhYmxlcywgcmVkdWNjacOzbiBkaW1lbnNpb25hbCBkZWwgZXNwYWNpbyBkZSBsb3MgZGF0b3MsIGVsaW1pbmFjacOzbiBkZSB2YXJhaWJsZXMgZGUgcG9jbyBhcG9ydGUgZSBpbnRlcnByZXRhY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzIHJlc3VsdGFudGVzIGVuIGVsIGNvbnRleHRvIGRlbCBwcm9ibGVtYSBkZWwgY3VhbCBzZSBvYnR1dmllcm9uIGxvcyBkYXRvcy4gRXN0YXMgZmFzZXMgc2UgZGVzYXJyb2xsYW4gZW50cmUgbGFzIHNlY2Npb25lcyBbN10oI3NlYzcpLCBbOF0oI3NlYzgpLCBbOV0oI3NlYzkpIHkgWzEwXSgjc2VjMTApLg0KDQojIyMgNy4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBkZW1hbmRhIHByaW1lcm8gZXN0YWJsZWNlciBlbCBwb3JjZW50YWplIGRlIHZhcmlhbnphIGV4cGxpY2FkbyBwb3IgY2FkYSBkaW1lbnNpw7NuIHVuYSB2ZXogcHJvY2VzYWRvIGVsIEFDUDsgeSBwb3N0ZXJpb3JtZW50ZSwgY29uIGJhc2UgZW4gZWwgYXV0b3ZhbG9yIG1lZGlvIG8gdXNhbmRvIHVuIGRpYWdyYW1hIGRlIHNlZGltZW50YWNpw7NuLCBkZWNpZGlyIGN1w6FudG9zIGNvbXBvbmVudGVzIHJldGVuZXIuIA0KDQojIyMgNy4yLiBEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIG5hdmVnYWNpw7NuIGEgdHJhdsOpcyBkZSBsYXMgcGVzdGHDsWFzIG11ZXN0cmEgcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBlbiByZWxhY2nDs24gY29uIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgcHVlZGUgc2VyIHJlcHJlc2VudGFkbyBwb3IgdW4gY29uanV0byBkZSB2YXJpYWJsZXMgbcOhcyBwZXF1ZcOxbyBxdWUgcmV0aWVuZSBlbCAkNzcuMDUkICRcJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlbCBjb25qdW50by4gRW4gcGFydGljdWxhcjoNCg0KTGEgKipNYXRyaXogQUNQKiogbXVlc3RyYSBzZWlzIGRpbWVuc2lvbmVzIGRvbmRlIHNvbG8gbGEgcHJpbWVyYSByZXRpZW5lIGVsICQ3Ny4wNSQgJFwlJCwgbGEgc2lndWllbnRlIGVsICQxMC4zMyQgJFwlJCB5IGxhcyBkZW3DoXMgc29sbyBwb3JjZW50YWplcyBjb24gcGFydGUgZW50ZXJhIGRlIHVuYSBjaWZyYS4gRW4gZXN0ZSBzZW50aWRvLCBsYSByZXByZXNlbnRhdGl2aWRhZCBkZSBsYSBjb21iaW5hY2nDs24gbGluZWFsIHF1ZSBkZWZpbmUgYSBsYSBkaW1lbnNpw7NuIDEgZXMgc2lnbmlmaWNhdGl2YW1lbnRlIGFsdGEgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgZGVtw6FzLiBDb21vIGVzdGEgbWF0cml6IGVzIG11ZGEgZW4gcmVsYWNpw7NuIGNvbiBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgc2Ugc2lndWUgaW5kYWdhbmRvIGxhIGlkZW50aWZpY2FjacOzbiBkZSBsYXMgdmFyaWFibGVzIHF1ZSBtw6FzIGNvbnRyaWJ1eWFuIGEgbGEgZGltZW5zacOzbiBkZSB2YWxvciBwcm9waW8gbcOhcyBhbHRvLg0KDQpMYSAqKk1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzKiogcGVybWl0ZSBjb250aW51YXIgY29uIGxhcyBkZXNjcmlwY2lvbmVzIGRlIGxhcyBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIHF1ZSBjb25mb3JtYW4gYSBsYSBkaW1lbnNpw7NuIGRlIG1heW9yIGludGVyw6lzOiBsYSBkaW1lbnNpw7NuIDEuIEFzw60sIGVzdGEgbWF0cml6LCBjb21vIHNlIG1vc3Ryw7MgZW4gbGEgW3NlY2Npw7NuIDMuMi5dKEBzZWMzXzIpLCAgYXl1ZGEgYSB2ZXJpZmljYXIgcXVlIGxhIGludGVuc2lkYWQgZGUgbGFzIGNvcmVsYWNpb25lcyBlcyBtw6FzIGFsdGEgeSBzaWVtcHJlIHBvc2l0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXM6IFRPRUZMX1Njb3JlLCBHUkVfU2NvcmUsIENHUEEgeSBDaGFuY2Vfb2ZfQWRtaXQsIGFzdW50byBlc3BlcmFkbyBlbiByZWxhY2nDs24gY29uIGVsIGZlbsOzbWVubyBlc3R1ZGlhZG8sIHBvciBsbyB0YW50bywgc2UgcG9kcsOtYSBlc3BlcmFyIHF1ZSBlc3RhcyB2YXJpYWJsZXMgcGFydGljaXBhcmFuIGVuIGxhIGNvbWJpbmFjacOzbiBsaW5lYWwgcXVlIGRlZmluZSBhIGxhIGRpbWVuc2nDs24gMS4NCg0KTGEgcGVzdGHDsWEgZGUgKipWYWxvcmVzIHkgVmVjdG9yZXMgUHJvcGlvcyoqIG11ZXN0cmEgZXN0b3Mgb2JqZXRvcyBjYWxjdWxhZG9zIGEgcGFydGlyIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4gRW4gZXN0ZSBzZW50aWRvLCBzZSBnYXJhbnRpemEgcXVlIGxhIHN1bWEgZGUgbG9zIHZhbG9yZXMgcHJvcGlvcyBzZWEgaWd1YWwgYSBsYSBkaW1lbnNpw7NuIGRlIGRpY2hhIG1hdHJpeiB5IGEgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlbCBjb25qdW50bywgcG9yIGxvIGN1YWwgbGFzIHByb3BvcmNpb25lcyBkZSByZXRlbmNpw7NuIGRlIHZhcmlhYmlsaWRhZCBzb24gZGUgY8OhbGN1bG8gaW5tZWRpYXRvLiBBZGVtw6FzLCBsYSBtYXRyaXogZGUgdmVjdG9yZXMgcHJvcGlvcyBkZWZpbmUgcGFyYSBjYWRhIGNvbXBvbmVudGUsIGVuIHJlbGFjacOzbiBjb24gY2FkYSB2YXJpYWJsZSBkZWwgY29uanVudG8gZGUgZGF0b3MsIGxvcyBjb2VmaWNpZW50ZXMgZGUgbGEgY29tYmluYWNpw7NuIGxpbmVhbCBxdWUgbGEgY29uZm9ybWFuLCBwb3IgZWplbXBsbywgY29uIHVuIGFqdXN0ZSBhIGRvcyBjaWZyYXMgZGVjaW1hbGVzLCBsYSBjb21wb25lbnRlIDEgZXN0YXLDrWEgcmVwcmVzZW50YWRhIHBvciBsYSBjb21iaW5hY2nDs24gbGluZWFsIChkb25kZSAkRyQgZXMgR1JFX1Njb3JlLCAkVCQgZXMgVE9FRkxfU2NvcmUsICRTJCBlcyBTT1AsICRMJCBlcyBMT1IsICRDRyQgZXMgQ0dQQSB5ICRDQSQgZXMgQ2hhbmNlX29mX0FkbWl0IHkgYWRlbcOhcywgc29uIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcyk6JCRDb21wb25lbnRlXzEgPSAwLjQxKkcrMC40MipUKzAuMzkqUyswLjM3KkwrMC40NCpDRyswLjQzKkNBJCRIYXN0YSBlc3RlIHB1bnRvLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgc2UgZGlzcG9uZSBkZSB1biBuw7ptZXJvIGRlIGRpbWVuc2lvbmVzIGlndWFsIGFsIG7Dum1lcm8gZGUgdmFyaWFibGVzIHRyYXRhZGFzLCBjb24gbGEgc2FsdmVkYWQgcXVlIGxhcyB2YXJpYWJsZXMgbnVldmFzIHNvbiBpbmNvcnJlbGFkYXMgZW50cmUgc8OtLCB2ZXIgbGEgcGVzdGHDsWEgKipDb3JyZWxhY2lvbmVzIENvbXBhcmFkYXMqKi4NCg0KUG9yIMO6bHRpbW8sIGVsICoqR3LDoWZpY28gZGUgQ2F0dGVsbCoqIHkgZWwgKipHcsOhZmljbyBkZSBDYXR0ZWxsLUthaXNlcioqLCBkZSBjb2RvIHkgc2VkaW1lbnRhY2nDs24sIGluZHVjZW4gYSBsYSBlbGVjY2nDs24gZGUgdW5hIGNvbXBvbmVudGUgZW4gbGEgcmVkdWNjacOzbiBkZSBkaW1lbnNpw7NuIHF1ZSByZXRpZW5lIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmlsaWRhZCBzdWZpY2llbnRlIHBhcmEgdHJhdGFyIGVsIHByb2JsZW1hLiBTaW4gZW1iYXJnbywgZGViZSByZXNhbHRhcnNlIHF1ZSBzZSBwcm9wb25lIGVsZWdpciBjb24gYmFzZSBlbiBjcml0ZXJpb3MgbcOhcyB1c2Fkb3MsIGEgY2FtYmlvIGRlIGNyaXRlcmlvcyBkZSBhY2VwdGFjacOzbiB1bml2ZXJzYWwuIEVsICoqR3LDoWZpY28gZGUgQ2F0dGVsbCoqIG11ZXN0cmEgcXVlIGxvcyBjYW1iaW9zIGVuIGxhIHBlbmRpZW50ZSBpbmRpY2FuIHF1ZSBsYSBjYXBhY2lkYWQgZXhwbGljYXRpdmEgZGUgbGEgZGltZW5zacOzbiAxIGVzIGFsdGEgY29tcGFyYWRhIGNvbiBlbCByZXN0by4gQXPDrSwgZWwgZGUgKipDYXR0ZWxsLUthaXNlcioqIGFsIGNvbmp1Z2FyIGVsIGluc3RydW1lbnRvIGdyw6FmaWNvIGFudGVyaW9yIGNvbiBlbCBjcml0ZXJpbyBkZSBLYWlzZXIgZW4gbGEgbWlzbWEgZ3LDoWZpY2EgYXBveWEgcXVlIGxhIGNhbnRpZGFkIGRlIGRpbWVuc2lvbmVzIHN1ZmljaWVudGVzIHBvciByZXRlbmVyIGVzIHVuYSwgYWNsYXJhbmRvIHF1ZSBlc3RhIGVsZWNjacOzbiByZXRlbmdhIHVuIHBvcmNlbnRhamUgZGUgdmFyaWFiaWxpZGFkIGFkZWN1YWRvIHBhcmEgZXN0dWRpYXIgZWwgcHJvYmxlbWEuDQoNCiMjIyMgTWF0cml6IEFDUA0KYGBge3IgTWF0cml6X0FDUCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZXRfZWlnZW52YWx1ZShQQ0EoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpDQpgYGANCg0KIyMjIyBNYXRyaXogZGUgQ29ycmVsYWNpb25lcw0KYGBge3IgTWF0cml6X2RlX0NvcnJlbGFjaW9uZXN9DQpyb3VuZChjb3IoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSksMikNCmBgYA0KDQojIyMjIFZhbG9yZXMgeSBWZWN0b3JlcyBQcm9waW9zDQpgYGB7ciBWYWxvcmVzX3lfVmVjdG9yZXNfUHJvcGlvcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwcmluY29tcChBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBjb3IgPSBUUlVFKSRzZGV2XjINCnByaW5jb21wKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIGNvciA9IFRSVUUpJGxvYWRpbmdzWyAsMTo2XQ0KYGBgDQoNCiMjIyMgQ29ycmVsYWNpb25lcyBDb21wYXJhZGFzDQpgYGB7ciBDb3JyZWxhY2lvbmVzX0NvbXBhcmFkYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnBhcihtZnJvdz1jKDEsMikpDQpjb3JycGxvdDo6Y29ycnBsb3QoY29yKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0pLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IocHJpbmNvbXAoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgY29yID0gVFJVRSkkc2NvcmVzKSwgbWV0aG9kID0gImNvbG9yIiwgdHlwZSA9ICJ1cHBlciIsIG51bWJlci5jZXggPSAwLjQpDQpgYGANCg0KIyMjIyBHcsOhZmljbyBkZSBDYXR0ZWxsDQpgYGB7ciBHcmFmaWNvX2RlX0NhdHRlbGwsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9laWcoUENBKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYpLCBhZGRsYWJlbHMgPSBULCB5bGltPWMoMCw5MCksIG1haW4gPSAiIikNCmBgYA0KDQojIyMjIEdyw6FmaWNvIGRlIENhdHRlbGwtS2Fpc2VyDQpgYGB7ciBHcmFmaWNvX2RlX0NhdHRlbGxfS2Fpc2VyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnNjcmVlKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sZmFjdG9ycyA9IEZBTFNFLCBwYyA9IFRSVUUsIG1haW4gPSIiKQ0KYGBgDQoNCjxhIG5hbWU9InNlYzgiPjwvYT4NCg0KIyMgKio4LiBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbioqDQpBbCByZXRvbWFyIGVsIHRyYWJham8gZGUgW0BBRURNRGlhei1Nb3JhbGVzMWVkXSBzZSB2ZXJpZmljYSBxdWUsIHVuYSB2ZXogcmVkdWNpZGEgbGEgZGltZW5zaW9uYWxpZGFkIGRlbCBjb25qdW50byBkZSBkYXRvcyB5IGVudGVuZGlkbyBxdWUgc3VzIHZhcmlhYmxlcyAoZXN0YW5kYXJpemFkYXMpIGVzdMOhbiByZXByZXNlbnRhZGFzIGdyw6FmaWNhbWVudGUgcG9yIHByb3llY2Npb25lcyBkZSBsYSBoaXBlcmVzZmVyYSBkZSBjb3JyZWxhY2lvbmVzLCBlcyBuZWNlc2FyaW8gaW5pY2lhciBsYSBpbnRlcnByZXRhY2nDs24gZGUgY29tcG9uZW50ZXMgYSBwYXJ0aXIgZGUgZGljaGFzIGNvcnJlbGFjaW9uZXMsIHBhcmEgbHVlZ28gbGEgY2FsaWRhZCBkZSBzdXMgcmVwcmVzZW50YWNpb25lcyBkYWRhIGxhIHJlZHVjY2nDs24gZGltZW5zaW9uYWwgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVuIHTDqXJtaW5vcyBkZSBzdXMgdmFyaWFibGVzLg0KDQojIyMgOC4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBkZW1hbmRhIGRldGVybWluYXIgbGEgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24gZGUgbGFzIHZhcmlhYmxlcyByZXNwZWN0byBhIGxhIGNhbnRpZGFkIGRlIGRpbWVuc2lvbmVzIGNhbGN1bGFkYXMgcXVlIHJldGllbmVuIGxhIG1heW9yIGNhbnRpZGFkIGRlIHZhcmlhYmlsaWRhZCwgdmVyIGxhIFtzZWNjacOzbiA3XSgjc2VjNykuDQoNCiMjIyA4LjIuIERlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTGEgbmF2ZWdhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBwZXN0YcOxYXMgbXVlc3RyYSBxdWUgbGEgcmVkdWNjacOzbiBkZSBsYSBkaW1lbnNpb25hbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGNvbmR1Y2UgYW5hbGl6YXIgbGFzIGNhbGlkYWRlcyBkZSByZXByZXNlbnRhY2nDs24gZW4gdMOpcm1pbm9zIGRlIGxhIGVzY2FsYSBkZSBjb250cmlidWNpb25lcyByZWxhdGl2YXMgYmFzYWRhIGVuIHVuIGNvY2llbnRlIGRlIHByb3llY2Npb25lcyBjb24gcHJvcGllZGFkZXMgYWRpdGl2YXMgeSBkZSByZXNwdWVzdGEgZW4gZXNjYWxhIGNvbnRpbnVhIGVudHJlICQwJCB5ICQxJC4gQXPDrSwgZW4gcGFydGljdWxhcjoNCg0KRWwgKipDw61yY3VsbyBkZSBDb3JyZWxhY2lvbmVzKiogZXhwcmVzYSBxdWUgc2UgcHVlZGUgY29uY2ViaXIgdW5hIGNvbXBlbmVudGUgdGlwbyB0YW1hw7FvIGVuIGVsIHNlbnRpZG8gZGUgcXVlIGxhIGRpbWVuc2nDs24gMSBtdWVzdHJhIGVuIMOpbCB1bmEgY29ycmVsYWNpw7NuIHBvc2l0aXZhIGNvbiBsYXMgc2VpcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMsIGFkZW3DoXMgY2VyY2FuYXMgYSBsYSBmcm9udGVyYSBkZWwgY8OtcmN1bG8gdW5pdGFyaW8geSBzaWduaWZpY2F0aXZhbWVudGUgcHLDs3hpbWFzIGFsIGVqZSBxdWUgbGEgcmVwcmVzZW50YS4gUG9yIG90cm8gbGFkbywgbGEgZGltZW5zacOzbiAyIGNvbnRyYXBvbmUgYSBsYXMgdmFyaWFibGVzICoqTE9SKiogeSAqKlNPUCoqIGNvbiBsYXMgZGVtw6FzLiBPdHJvIGFzcGVjdG8gcG9yIHJlc2FsdGFyIGVzIGxhIGNvcnJlbGFjacOzbiBtb3N0cmFkYSBlbnRyZSBwYXJlcyBkZSB2YXJpYWJsZXMsIHF1ZSBlbiB0w6lybWlub3MgZGVsIGZlbsOzbWVubyBlc3R1ZGlhZG8gY29uc2VydmFuIHN1IG5hdHVyYWxlemEgY29ycmVsYWNpb25hbCBlc3BlcmFkYSBoYXN0YSBlc3RlIHB1bnRvIGRlbCBhbsOhbGlzaXMuIFVuIGVqZW1wbG8gcmVzYWx0YWJsZSBlcyBlbCBwYXIgKipTT1AqKiB5ICoqTE9SKiogcXVlLCBlbiBjaWVydG8gc2VudGlkbywgZXN0w6FuIGluZmx1aWRhcyBwb3IgbGEgc3ViamV0aXZpZGFkLCB2w6lhc2UgbGEgW3NlY2Npw7NuIDJdKCNzZWMyKS4NCg0KTGEgKipNYXRyaXogZGUgUmVwcmVzZW50YWNpw7NuKiosIHBvciBvdHJvIGxhZG8sIG11ZXN0cmEgdmFsb3JlcyBzaWduaWZpY2F0aXZhbWVudGUgY2VyY2Fub3MgYSAxIGRlbCBjb2NpZW50ZSBkZSBwcm95ZWNjaW9uZXMgY29zZW5vIGN1YWRyYWRvIGVuIHJlbGFjacOzbiBjb24gbGEgZGltZW5zacOzbiAxLiBFbiBlc3RlIHNlbnRpZG8sIGxvcyBwdW50b3MgcHJveWVjdGFkb3MgZXN0w6FuIGFsdGFtZW50ZSBhc29jaWFkb3MgY29uIGVzdGUgY29tcG9uZW50ZS4gQXPDrSwgbGEgZXN0YcOxYSBxdWUgbXVlc3RyYSBsYSAqKkNhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuKiogaW5kaWNhIGVuIHN1IGVzY2FsYSB1biBwaXNvIGFsdG8gZGUgJDAuODQkIGRlIGVzdGEgbWFuZXJhIGxhcyBjYWxpZGFkZXMgZGUgcmVwcmVzZW50YWNpw7NuLCBlbiByZWxhY2nDs24gY29uIGxhIGNvbXBvbmVudGUgMSwgZXN0w6FuIGVuY2FiZXphZGFzIHBvciAqKkNHUEEqKiB5IGNpZXJyYW4gY29uICoqU09QKiouIENhYmUgYWNsYXJhciBxdWUgbGEgZGltZW5zacOzbiAyIHNvc3RpZW5lIHVuYSBtZWpvciByZXByZXNlbnRhY2nDs24gZGUgKipMT1IqKiBxdWUgZGUgKipTT1AqKiwgcG9yIGxvIHRhbnRvLCBsYSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjacOzbiBkZSBsYSBwcmltZXJhIGVuIHJlbGFjacOzbiBjb24gbGEgZGltZW5zacOzbiAxIHNlIHZlIGFmZWN0YWRhLg0KDQpQb3Igw7psdGltbywgbGFzICoqQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzKiogYXl1ZGFuLCBhdW5xdWUgZGUgbWFuZXJhIG1lbm9zIGRpZ2VzdGl2YSwgYSBpZGVudGlmaWNhciBhIG5pdmVsIGRlIG9ic2VydmFjaW9uZXMgYSBsb3MgcGVyZmlsZXMgZGUgbG9zIHJlZ2lzdHJvcywgZW4gZXN0ZSBjYXNvIGVzdHVkaWFudGVzLCBlbiByZWxhY2nDs24gY29uIGxhcywgcG9yIGxvIG1lbm9zLCBkaW1lbnNpb25lcyBtw6FzIGltcG9ydGFudGVzIGRlIHJldGVuY2nDs24gZGUgdmFyaWFiaWxpZGFkOiBsYXMgY29tcG9uZW50ZXMgMSB5IDIuIFBvciBlamVtcGxvLCBhbCBvYnNlcnZhciBsb3MgcmVnaXN0cm9zIDEsIDksIDIzLCBzZSBtYW5pZmllc3RhbiBsYXMgc2VtZWphbnphcyBlbnRyZSAxIHkgMjMgZW4gb3Bvc2ljacOzbiBkZSBhbWJvcyBjb24gOSwgaW5jbHVzbyBhbCBjb25zaWRlcmFyIGEgbGEgdmFyaWFibGUgcGVvciByZXByZXNlbnRhZGEgKipTT1AqKi4NCg0KIyMjIyBDw61yY3VsbyBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBDaXJjdWxvX2RlX0NvcnJlbGFjaW9uZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9wY2FfdmFyKFBDQShBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGKSxjb2wudmFyPSIjM0I4M0JEIiwgcmVwZWwgPSBULCBjb2wuY2lyY2xlID0gIiNDRENEQ0QiLCBnZ3RoZW1lID0gdGhlbWVfYncoKSkNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBSZXByZXNlbnRhY2nDs24NCmBgYHtyIE1hdHJpel9kZV9SZXByZXNzZW50YWNpb25fQ09TMiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpKSkkY29zMg0KYGBgDQoNCiMjIyMgQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24NCmBgYHtyIENhbGlkYWRfZGVfbGFfUmVwcmVzZW50YWNpb24sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9wY2FfdmFyKFBDQShBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY29sLnZhcj0iY29zMiIsIGdyYWRpZW50LmNvbHM9YygiIzAwQUZCQiIsIiNFN0I4MDAiLCIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcw0KYGBge3IgQ29vcmRlbmFkYXNfUmVnaXN0cm9zLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmhlYWQoKFBDQShBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkkaW5kJGNvb3JkLCBuID0gMjNMKQ0KYGBgDQoNCjxhIG5hbWU9InNlYzkiPjwvYT4NCg0KIyMgKio5LiBDb250cmlidWNpb25lcyoqDQpTZWfDum4gZWwgdHJhYmFqbyBkZSBbQEFFRE1EaWF6LU1vcmFsZXMxZWRdIGxhIGludGVycHJldGFjacOzbiBkZSByZXN1bHRhZG9zIGVzdMOhIHZpbmN1bGFkYSBjb24gZWwgY8OhbGN1bG8gZGUgY29vcmRlbmFkYXMsIGNvbnRyaWJ1Y2lvbmVzLCBjb3Nlbm9zIGN1YWRyYWRvcywgZXRjLCBwb3IgbG8gdGFudG8sIGxhIGNvbmNlcHR1YWxpemFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGRlYmUgc2VyIGNsYXJhIHBhcmEgZXN0YWJsZWNlcmxhIGNvbiBsYSBtYXlvciBjbGFyaWRhZCBwb3NpYmxlLCBlcyBkZWNpciwgbG9zIGRhdG9zIGRlYmVuIHBvbmVyc2UgZW4gY29udGV4dG8uIEVuIGVzdGUgc2VudGlkbywgbGEgY29udHJpYnVjacOzbiBkZSB1bmEgdmFyaWFibGUgYSB1bmEgY29tcG9uZW50ZSBhbGxhbmEgZWwgY2FtaW5vIGRlIGxhIGludGVycHJldGFjacOzbiBkZSByZXN1bHRhZG9zLiBFc3RvIHNlIGhhY2UgZW4gZXN0ZSBhcGFydGFkbyBlbiBlbCBzZW50aWRvIGRlIGNhbGN1bGFyIGxvciBhcG9ydGVzIGNvbiBxdWUgY2FkYSB2YXJpYWJsZSBwYXJ0aWNpcGEgcGFyYSBkZWZpbmlyIGEgY2FkYSBjb21wb25lbnRlIGdlbmVyYWRhLg0KDQojIyMgOS4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBkZW1hbmRhIGRldGVybWluYXIgbGFzIGNvbnRyaWJ1Y2lvbmVzIHF1ZSBoYWNlIGNhZGEgdmFyaWFibGUgYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIGNhZGEgY29tcG9uZW50ZS4NCg0KIyMjIDkuMi4gRGVzYXJyb2xsbyBkZWwgQW7DoWxpc2lzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBwZXJtaXRlIHJlY29ub2NlciBlbiByZXByZXNlbnRhY2lvbmVzIG51bcOpcmljYXMgeSBncsOhZmljYXMgbGFzIGNvbnRyaWJ1Y2lvbmVzIGRlIGxhcyB2YXJpYWJsZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGEgbGEgY29uc3RydWNjacOzbiBkZSBjYWRhIGNvbXBvbmVudGUuIEFzw60sIHNlIGVudGllbmRlIGN1w6FudGEgdmFyaWFiaWxpZGFkIGV4cGxpY2EgY2FkYSB2YXJpYWJsZSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgZGUgbGEgY29tcG9uZW50ZSBjb24gcXVlIGVzdMOpIGludm9sdWNyYWRhLiBlbiBwYXJ0aWN1bGFyOg0KDQpMYSAqKk1hdHJpeiBkZSBDb250cmlidWNpb25lcyoqIG11ZXN0cmEgZW4gdMOpcm1pbm9zIHJlbGF0aXZvcyBsYSByZXRlbmNpw7NuIGRlIHZhcmlhYmlsaWRhZCBxdWUgdGllbmUgY2FkYSB2YXJpYWJsZSBlbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIGNhZGEgY29tcG9uZW50ZS4gQXPDrSwgbG9zIGRpYWdyYW1hcyBkZSBiYXJyYXMgdmlzdWFsaXphZG9zIGEgdHJhdsOpcyBkZSBsYXMgcGVzdGHDsWFzIGRlc2RlICoqQ29udHJpYnVjaW9uZXMgYSBEMSoqIGhhc3RhICoqQ29udHJpYnVjaW9uZXMgYSBENioqLCBtdWVzdHJhbiBjb24gYmFzZSBlbiBkaWFncmFtYXMgZGUgYmFycmFzIGxhcyByZXNwZWN0aXZhcyBjb250cmlidWNpb25lcyBxdWUgaGFjZW4gbGFzIHZhcmlhYmxlcyBwYXJhIGV4cGxpY2FyIGxhIHZhcmlhbnphciBlbiBjYWRhIGNvbXBvbmVudGU7IGFkZW3DoXMsIGNhZGEgZ3LDoWZpY28gaW5jbHV5ZSB1bmEgbMOtbmVhIHF1ZSBheXVkYSBhIGlkZW50aWZpY2FyIGxhIGNvbnRyaWJ1Y2nDs24gbWVkaWEsIGVzdG8gYXl1ZGEgYSBpZGVudGlmaWNhciBjb24gbWF5b3IgZmFjaWxpZGFkIGEgbGFzIHZhcmlhYmxlcyBxdWUgY29udHJpYnV5ZW4gY29uIG1heW9yIGV4cGxpY2FjacOzbiBkZSB2YXJpYWJpbGlkYWQgZGUgbG9zIGNvbXBvbmVudGVzIHF1ZSBjb25mb3JtYW4uDQoNCkVuICoqQ29udHJpYnVjaW9uZXMgYSBEMSoqIHNlIHZpc3VhbGl6YSBxdWUgbGFzIHZhcmlhYmxlcyBwb3IgZW5jaWFtYSBkZSBsYSBjb250cmlidWNpw7NuIG1lZGlhOiAqKkNHUEEqKiwgKipDaGFuY2Vfb2ZfQWRtaXQqKiwgKipUT0VGTF9TY29yZSoqIHkgKipHUkVfU2NvcmUqKiByZXRpZW5lbiBhcHJveGltYWRhbWVudGUgZWwgJDcxLjcyJCAkXCUkIGRlIGxhIHZhcmlhYmlsaWRhZCBkZWwgY29tcG9uZW50ZSAxLg0KDQpFbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDIqKiBzZSB2aXN1YWxpemEgcXVlIGxhcyB2YXJpYWJsZXMgcG9yIGVuY2lhbWEgZGUgbGEgY29udHJpYnVjacOzbiBtZWRpYTogKipMT1IqKiB5ICoqU09QKiogcmV0aWVuZW4gYXByb3hpbWFkYW1lbnRlIGVsICQ2Ny44NyQgJFwlJCBkZSBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbXBvbmVudGUgMi4NCg0KRW4gKipDb250cmlidWNpb25lcyBhIEQzKiogc2UgdmlzdWFsaXphIHF1ZSBsYXMgdmFyaWFibGVzIHBvciBlbmNpYW1hIGRlIGxhIGNvbnRyaWJ1Y2nDs24gbWVkaWE6ICoqU09QKiogeSAqKkxPUioqIHJldGllbmVuIGFwcm94aW1hZGFtZW50ZSBlbCAkODEuMzckICRcJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlbCBjb21wb25lbnRlIDMuDQoNCkVuICoqQ29udHJpYnVjaW9uZXMgYSBENCoqIHNlIHZpc3VhbGl6YSBxdWUgbGFzIHZhcmlhYmxlcyBwb3IgZW5jaWFtYSBkZSBsYSBjb250cmlidWNpw7NuIG1lZGlhOiAqKkNoYW5jZV9vZl9BZG1pdCoqIHkgKipUT0VGTF9TY29yZSoqIHJldGllbmVuIGFwcm94aW1hZGFtZW50ZSBlbCAkNTcuNzYkICRcJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlbCBjb21wb25lbnRlIDQuDQoNCkVuICoqQ29udHJpYnVjaW9uZXMgYSBENSoqIHNlIHZpc3VhbGl6YSBxdWUgbGFzIHZhcmlhYmxlcyBwb3IgZW5jaWFtYSBkZSBsYSBjb250cmlidWNpw7NuIG1lZGlhOiAqKkdSRV9TY29yZSoqIHkgKipUT0VGTF9TY29yZSoqIHJldGllbmVuIGFwcm94aW1hZGFtZW50ZSBlbCAkOTUuNTEkICRcJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlbCBjb21wb25lbnRlIDUuDQoNClBvciDDumx0aW1vLCBlbiAqKkNvbnRyaWJ1Y2lvbmVzIGEgRDYqKiBzZSB2aXN1YWxpemEgcXVlIGxhcyB2YXJpYWJsZXMgcG9yIGVuY2lhbWEgZGUgbGEgY29udHJpYnVjacOzbiBtZWRpYTogKipDR1BBKiogeSAqKkNoYW5jZV9vZl9BZG1pdCoqIHJldGllbmVuIGFwcm94aW1hZGFtZW50ZSBlbCAkOTYuMDYkICRcJSQgZGUgbGEgdmFyaWFiaWxpZGFkIGRlbCBjb21wb25lbnRlIDYuDQoNCkNvbiBsb3MgZGF0b3MgcHJvY2VzYWRvcyBoYXN0YSBhaG9yYSBzZSBwdWVkZSBwcm9jZWRlciBjb24gbGEgaW50ZXByZXRhY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzLg0KDQojIyMjIE1hdHJpeiBkZSBDb250cmlidWNpb25lcw0KYGBge3IgTWF0cml6X2RlX0NvbnRyaWJ1Y2lvbmVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCihnZXRfcGNhX3ZhcihQQ0EoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpKSRjb250cmliDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQxDQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fMSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDEsIHRvcCA9IDEwKQ0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBEMg0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAyLCB0b3AgPSAxMCkNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDMNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX0RJTV8zLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMywgdG9wID0gMTApDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQ0DQpgYGB7ciBDb250cmlidWNpb25lc19ESU1fNCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKEFkbWlzc2lvbl9EYXRhc2V0WywtYygxLDIsOCw5KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDQsIHRvcCA9IDEwKQ0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBENQ0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShBZG1pc3Npb25fRGF0YXNldFssLWMoMSwyLDgsOSldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA1LCB0b3AgPSAxMCkNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDYNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX0RJTV82LCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EoQWRtaXNzaW9uX0RhdGFzZXRbLC1jKDEsMiw4LDkpXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gNiwgdG9wID0gMTApDQpgYGANCg0KPGEgbmFtZT0ic2VjMTAiPjwvYT4NCg0KIyMgKioxMC4gSW50ZXJwcmV0YWNpw7NuIGRlIENvbXBvbmVudGVzKioNCkNvbiBiYXNlIGVuIFtAQUVETURpYXotTW9yYWxlczFlZF0gc2Ugc2FiZSBxdWUgYSBwYXJ0aXIgZGUgbGFzIGNvb3JkZW5hZGFzIGRlIGxvcyByZWdpc3Ryb3MgZGltZW5zaW9uYWxtZW50ZSByZWR1Y2lkb3Mgc2UgcHVlZGUgdWJpY2FyIGVuIHVuIHBsYW5vIGRlIGZhY3RvcmVzIHBhcmEgZWZlY3RvcyBkZSBhbsOhbGlzaXMgZSBpbnRlcnByZXRhY2nDs24uIEFzw60sIGxhcyB2YXJpYWJsZXMgcmVkdWNpZGFzIHNvbiBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgcXVlIHNlIGdyYWZpY2FuIGNvbW8gZWplcyBlbiB1biBwbGFubywgeSBsb3MgdmFsb3JlcyBxdWUgdG9tZW4gc29uIGxvcyBwdW50YWplcyBkZSBsYXMgY29tcG9uZW50ZXMuIENvbW8gYmllbiBzZSBleHBsaWNhIGVuIGVsIG1pc21vIHRyYWJham8sIGxhcyBkaXN0YW5jaWFzIGVudHJlIGxvcyBwdW50b3MgZGVmaW5pZG9zIHBvciBsb3MgcHVudGFqZXMgZGUgbGFzIGNvbXBvbmVudGVzIHRpZW5lIHVuIHNpZ25pZmljYWRvIHJlbGV2YW50ZSBhbCBheXVkYXIgYSBlc3RhYmxlY2VyIHNlbWVqYW56YXMgZGUgcGVyZmlsZXMgZW4gbGFzIG9ic2VydmFjaW9uZXMgaGVjaGFzLiBTaW4gZW1iYXJnbywgbG9zIHZhbG9yZXMgc2VtZWphbnRlcyBkZSBsYXMgdmFyaWFibGVzIHB1ZWRlbiBkYXJzZSBzb2xvIGVuIGFsZ3VuYXMgZGUgZWxsYXMsIHNpbiBlc3BlcmFyIG5lY2VzYXJpYW1lbnRlIGEgcXVlIHN1Y2VkYSBlbiB0b2Rhcy4gQXPDrSwgc2UgZXNwZXJhIHF1ZSBsYXMgZGlzdGFuY2lhcyBlbiBlbCBlc3BhY2lvIGRpbWVuc2lvbmFsIG9yaWdpbmFsIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHF1ZWRlbiBiaWVuIHJlcHJlc2VudGFkYXMgZW4gZWwgZXNwYWNpbyByZWR1Y2lkbyBkZSBsYXMgY29tcG9uZW50ZXMuDQoNCiMjIyAxMC4xLiBQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYQ0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdKCNzZWMyKSBzZSBkZW1hbmRhIGRlZmluaXIgZSBpbnRlcnByZXRhciBzdXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNCiMjIyAxMC4yLiBEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIG5hdmVnYWNpw7NuIGEgdHJhdsOpcyBkZSBsYXMgcGVzdGHDsWFzIHBlcm1pdGUgdmlzdWFsaXphciBvYmpldG9zIGdyw6FmaWNvcyB5IG1hdHJpY2lhbGVzIHF1ZSwgYWwgaW5jbHVpciBsbyBoZWNobyBlbiBsYXMgc2VjY2lvbmVzIGFudGVyaW9yZXMsIGF5dWRhbiBhIHJvYnVzdGVjZXIgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxhcyBjb21wb25lbnRlcyBjYWxjdWxhZGFzLiBDb21vIHNlIG1vc3Ryw7MgZW4gbGEgW3NlY2Npw7NuIDddKCNzZWM3KSwgbGEgY2FudGlkYWQgZGUgY29tcG9uZW50ZXMgc2VsZWNjaW9uYWRhcyBzZSByZWR1am8gKHNlZ8O6biBlbCBjcml0ZXJpbyBkZSBLYWlzZXIpIGEgdW5hIHkgc2UgZXN0YWJsZWNpw7MgcXVlIGxhIGNvbXBvbmVudGUgMSByZXRpZW5lIGVsICQ3Ny4wNSQgJFwlJCBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zLiBBc8OtLCBlbiBlbCBjw61yY3VsbyBkZSBjb3JyZWxhY2lvbmVzIGRlIGxhIFtzZWNjacOzbiA4XSgjc2VjOCkgc2UgYXByZWNpYSBxdWUgbGEgcmVwcmVzZW50YWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY29uanVnYWRhcyBlbiBsYSBjb21wb25lbnRlIDEgbGEgY29uZmlndXJhbiBjb21vIHVuYSBkZSB0aXBvIHRhbWHDsW8sIGxvIHF1ZSBwdWVkZSBpbnRlcnByZXRhcnNlIGNvbW8gdW5hIGVzcGVjaWUgZGUgw61uZGljZSBkZSBwcm9wb3JjaW9uYWxpZGFkIGRpcmVjdGEuIEVzdG8gdGFtYmnDqW4gc2UgYXBveWEgY29uIGJhc2UgZW4gZWwgaGVjaG8gZGUgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgcHJlc2VudGFuIGNhbGlkYWRlcyBkZSByZXByZXNlbnRhY2nDs24gZW50cmUgJDAuNjIkIHkgJDAuODgkLiBFbiBjb25zZWN1ZW5jaWEsIGN1YW50byBtYXlvciBzZWEgZWwgdmFsb3IgbGFzIHZhcmlhYmxlcyBtYXlvciBzZXLDoSBlbCBlc3RhZG8gZGUgZmF2b3JhYmlsaWRhZCBkZSBxdWUgZWwgZXN0dWRpYW50ZSBzZWEgYWRtaXRpZG8gcG9yIGxhIHVuaXZyc2lkYWQgZGUgc3UgcHJlZmVyZW5jaWEuIEFzw60sIGRhZGEgbGEgbmF0dXJhbGV6YSBkZSBsYXMgdmFyaWFibGVzIGVzdGEgY29tcG9uZW50ZSBwdWVkZSByZXByZXNlbnRhciBwYXJhIHVuIGVzdHVkaWFudGUgc3UgKiptZWRpZGEgZGUgY29tcGV0aXRpdmlkYWQgZm9ybWF0aXZhKiouIEFsIHJlc3BlY3RvOg0KDQpMYXMgcGVzdGHDsWFzICoqQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBUb3RhbGVzKiogZW4gKipVUioqIChVbml2ZXJzaXR5IFJhdGluZyksICoqRyoqIChHZW5kZXIpIHkgKipSKiogKFJlc2VhcmNoKSwgbXVlc3RyYW4sIGNvbiBiYXNlIGVuIGxhcyBhZ3J1cGFjaW9uZXMgcXVlIGVzdGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgcHVlZGVuIGVzdGFibGVjZXIsIGxhIHJlcHJlc2VudGFjacOzbiBlbiBkaW1lbnNpb25hbGlkYWQgcmVkdWNpZGEgZW4gZWwgcGxhbm8gZGUgZmFjdG9yZXMgZGUgcmVnaXN0cm9zIHkgZGltZW5zaW9uZXMgY29uIGJhc2UgZW4gbG9zIHB1bnRhamVzIHBvciBjb21wb25lbnRlcy4gRW4gZXN0ZSBzZW50aWRvLCBlcyBwb3NpYmxlIGFwcmVjaWFyIHF1ZSBsYXMgYWdydXBhY2lvbmVzIGNvbiBiYXNlIGVuICoqVW5pdmVyc2l0eV9SYXRpbmcqKiB5ICoqUmVzZWFyY2gqKiBjYXB0dXJhbiBkaWZlcmVuY2lhcyBhY2VudHVhZGFzIGVuIGxhIGRpc3RyaWJ1Y2lvbmVzIGRlIGxhcyBvYnNlcnZhY2lvbmVzLCBjb250cmFyaW8gYSBsYSBhZ3J1cGFjacOzbiBjb24gYmFzZSBlbiAqKkdlbmRlcioqLg0KDQpQb3Igw7psdGltbywgcGFyYSBmYWNpbGl0YXIgbGEgdmVyaWZpY2FjacOzbiBkZSBsYSB1YmljYWNpw7NuIGRlIHB1bnRhamVzIGVuIGVsIHBsYW5vIGRlIGNvbXBvbmVudGVzIChlbiBwYXJ0aWN1bGFyLCBzaWVtcHJlIGNvbmZvcm1hZG8gcG9yIGxhcyBjb21wb25lbnRlcyAxIHkgMiBwb3IgZWwgaW50ZXLDqXMgcXVlIHN1Y2l0YW4pIHksIGFzaW1pc21vLCBsYXMgc2VtZWphbnphcyBkZSBwZXJmaWxlcyB5IGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcywgc2UgZGlzcHVzbyBkZSBsYXMgcGVzdGHDsWFzICoqQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzIFtTdWJjb25qdW50byBVUl0qKiB5ICoqQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbU3ViY29uanVudG8gVVJdKiouIEVzdGFzIG11ZXN0cmFuLCBjb24gYmFzZSBlbiB1biBzdWJjb25qdXRvIGRlIDYxIHJlZ2lzdHJvcyBtdWVzdHJhZG8gYWxlYXRvcmlvIHNpbXBsZSwgbG9zIHB1bnRhamVzIHBvciBjb21wb25lbnRlcyB5IGVsIGJpcGxvdCBkZSBlc2Ugc3ViY29uanVudG8sIGNvbiBiYXNlIGVuIGxhIGFncnVwYWNpw7NuIHByb3Zpc3RhIHBvciBsYSB2YXJhaWJsZSBjYXRlZ8OzcmljYSAqKlVuaXZlcnNpdHlfUmF0aW5nKiosIHNpbiBww6lyZGlkYSBzaWduaWZpY2F0aXZhIGRlIGRldGFsbGVzLiBFc3RvLCBzZSBpbnNpc3RlLCBzb2xvIHRpZW5lIGZpbmVzIGRpZMOhY3RpY29zLCBkZWJpZG8gYSBsYSBkaWZpY3VsdGFkIGRlIGlkZW50aWZpY2FjacOzbiB2aXN1YWwgcXVlIHByZXNlbnRhIGVsIGNvbmp1bnRvIG9yaWdpbmFsIHF1ZSBjb250aWVuZSA0MDAgcmVnaXN0cm9zLg0KDQojIyMjIEJpcGxvdCBkZSBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgW1RvdGFsIFVSXQ0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc195X1JlZ2lzdHJvc19Ub3RhbF9VUiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpkYXRhX1VSIDwtIEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWxbLC1jKDEsMiw4KV0NCmRhdGFfQWxsIDwtIGNiaW5kKEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWxbLC1jKDEsMiw4LDkpXSwgZGF0YV9VUiRVbml2ZXJzaXR5X1JhdGluZykNCmZ2aXpfcGNhX2JpcGxvdChQQ0EoZGF0YV9BbGwsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDcpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBUUlVFLCBoYWJpbGxhZ2UgPSA3KQ0KYGBgDQoNCiMjIyMgQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbVG90YWwgR10NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfVG90YWxfRywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpkYXRhX1VSIDwtIEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWxbLC1jKDEsOCw5KV0NCmRhdGFfQWxsIDwtIGNiaW5kKEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWxbLC1jKDEsMiw4LDkpXSwgZGF0YV9VUiRHZW5kZXIpDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfQWxsLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojIyMjIEJpcGxvdCBkZSBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgW1RvdGFsIFJdDQpgYGB7ciBCaXBsb3RfZGVfVmFyaWFibGVzX3lfUmVnaXN0cm9zX1RvdGFsX1IsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZGF0YV9VUiA8LSBBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsWywtYygxLDIsOSldDQpkYXRhX0FsbCA8LSBjYmluZChBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsWywtYygxLDIsOCw5KV0sIGRhdGFfVVIkUmVzZWFyY2gpDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfQWxsLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gNykNCmBgYA0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcyBbU3ViY29uanVudG8gVVJdDQpgYGB7ciBDb29yZGVuYWRhc19JbmRpdmlkdWFsZXNfU3ViY29uanVudG8sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KZGF0YV82MV9VUiA8LSBBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsW3NhbXBsZSgxOm5yb3coQWRtaXNzaW9uX0RhdGFzZXRfSW5pdGlhbCksNjEpLC1jKDEsMiw4KV0NCnNldC5zZWVkKDc4MDcyOCkNCmRhdGFfNjEgPC0gY2JpbmQoQWRtaXNzaW9uX0RhdGFzZXRfSW5pdGlhbFtzYW1wbGUoMTpucm93KEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWwpLDYxKSwtYygxLDIsOCw5KV0sIGRhdGFfNjFfVVIkVW5pdmVyc2l0eV9SYXRpbmcpDQpoZWFkKFBDQShkYXRhXzYxLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVCwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSA3KSRpbmQkY29vcmQsIG4gPSA2MUwpDQpgYGANCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtTdWJjb25qdW50byBVUl0NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfU3ViY29uanVudG8sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KZGF0YV82MV9VUiA8LSBBZG1pc3Npb25fRGF0YXNldF9Jbml0aWFsW3NhbXBsZSgxOm5yb3coQWRtaXNzaW9uX0RhdGFzZXRfSW5pdGlhbCksNjEpLC1jKDEsMiw4KV0NCnNldC5zZWVkKDc4MDcyOCkNCmRhdGFfNjEgPC0gY2JpbmQoQWRtaXNzaW9uX0RhdGFzZXRfSW5pdGlhbFtzYW1wbGUoMTpucm93KEFkbWlzc2lvbl9EYXRhc2V0X0luaXRpYWwpLDYxKSwtYygxLDIsOCw5KV0sIGRhdGFfNjFfVVIkVW5pdmVyc2l0eV9SYXRpbmcpDQpmdml6X3BjYV9iaXBsb3QoUENBKGRhdGFfNjEsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDcpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBULCBoYWJpbGxhZ2UgPSA3KQ0KYGBgDQoNCiMjICoqQ29uY2x1c2lvbmVzKioNCkNvbXBsZW1lbnRhcmlhbWVudGUgYSBsb3MgYW7DoWxpc2lzIHF1ZSBmdWVyb24gZXhwdWVzdG9zIGVuIGxhcyBzZWNjaW9uZXMgZGUgZXN0dWRpbyBlcyBpbXBvcnRhbnRlIGhhY2VyIHVuYSBtZW5jacOzbiBnbG9iYWwgc29icmUgZWwgcHJvYmxlbWEgY29uc2lkZXJhZG8gYSBsYSBsdXogZGUgbG8gb2J0ZW5pZG8uDQoNCkNvbW8gc2UgbWVuY2lvbmEgZW4gZWwgdHJhYmFqbyBoZWNobyBlbiBlbCBjdXJzbyBBbsOhbGlzaXMgZGUgUmVncmVzacOzbiAocXVlIHB1ZWRlIHNlciBjb25zdWx0YWRvIHRlbXBvcmFsbWVudGUgYSB0cmF2w6lzIGRlOiBodHRwczovL3JwdWJzLmNvbS9nbGlicmVyb3NsL0FwcGxpZWQtU3RhdGlzdGljcy1GVUxMKSwgbGFzIGFzcGlyYWNpb25lcyBkZSB1biBlc3R1ZGlhbnRlIGV4dHJhbmplcm8gcGFyYSBpbmdyZXNhciBhIHVuYSB1bml2ZXJzaWRhZCBub3J0ZWFtZXJpY2FuYSBzZSBlbmZyZW50YW4gYSB1biBlbGV2YWRvIGdyYWRvIGRlIGNvbXBldGljacOzbi4gQWRlbcOhcywgc2UgY29uc3RhdGEsIGRlc2RlIGxhIHBlcnNwZWN0aXZhIGRlIGVzdHVkaW8gbXVsdGl2YXJpYWJsZSwgcXVlLCBwb3IgbG8gbWVub3MgZGVzY3JpcHRpdmFtZW50ZSwgdW5hIHZhcmlhYmxlIGNsYXNpZmljYWRvcmEgY2F0ZWfDs3JpY2EgY29tbyBlbCBzZXhvLCByZXN1bHRhIG11eSBwb2NvIHNpZ25pZmljYXRpdmEgZm9ybWFyIGdydXBvcyBkaWZlcmVuY2lhZG9zIGVudHJlIGxvcyBlc3R1ZGlhbnRlcyBjb24gYXNwaXJhY2lvbmVzIGRlIGluZ3Jlc28sIGFzdW50byBxdWUgY29udHJhc3RhIGNvbiBsb3MgcmVsYXRvcyBzb2Npby1wb3B1bGlzdGFzIGJhc2Fkb3MgZW4gZmFsYWNpYXMgX2FkIGhvbWluZW1fLiBFbCBkYXRvLCBzaSBlcyBmaW5vLCBzaWVtcHJlIHNlcsOhIG9iamV0aXZvLg0KDQpDb21wbGVtZW50YXJpYW1lbnRlLCB0b2RhcyBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFudGUgcmVzdWx0YXJvbiBuZWdhdGl2YXMsIHNhbHZvIHF1ZSBhIG5pdmVsIHVuaXZhcmlhZG8gbGEgdmFyaWFibGUgKipDR1BBKiogcHJlc2VudMOzIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGVuIHRvZGFzIGVsbGFzLiBBc8OtLCBlbCBkZXRlcmlvcm8gZGUgbGFzIHByb3BpZWRhZGVzIGRlIGluZGVwZW5kZW5jaWEgbGluZWFsIGp1ZWdhbiBhIGZhdm9yIGRlIGxhIHPDrW50ZXNpcyBkZSBpbmZvcm1hY2nDs24gYSB0cmF2w6lzIGRlIGxhIGVzdGltYWNpw7NuIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiBFc3RlIHB1ZG8gZGVzY3JpYmlyIHVuYSAqKm1lZGlkYSBkZSBjb21wZXRpdGl2aWRhZCBmb3JtYXRpdmEqKiBxdWUgY29uanVnYSwgY29uIHVuYSByZXRlbmNpw7NuIGRlICQ3Ny4wNSQgJFwlJCBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBsYSBuYXR1cmFsZXphIGludGVycHJldGF0aXZhIGRlbCBmZW7Ds21lbm8gZXN0dWRpYWRvLiBBc8OtLCBjdWFudG8gbWF5b3Igc2VhIGVsIHZhbG9yIGxhcyB2YXJpYWJsZXMgcXVlIHJlZ2lzdHJhIHVuIGVzdHVkaWFudGUgcGFyYSBhcGxpY2FyIGEgdW5hIHBsYXphIGVuIHVuYSB1bml2ZXJzaWRhZCBkZSBzdSBlbGVjY2nDs24sIG1heW9yIHNlcsOhIGVsIGVzdGFkbyBkZSBmYXZvcmFiaWxpZGFkIGRlIHF1ZSBlbCBlc3R1ZGlhbnRlIHNlYSBhZG1pdGlkbyBwb3IgbGEgdW5pdmVyc2lkYWQgZGUgc3UgcHJlZmVyZW5jaWEuIA0KDQpQb3Igw7psdGltbywgZXMgaW1wb3J0YW50ZSByZXNhbHRhciBlbCBhc3BlY3RvIHTDqWNuaWNvIHJlbGFjaW9uYWRvIGNvbiBlbCBwcm9jZXNhbWllbnRvIGVzdGFkw61zdGljbyBoZWNobyBlbiBlc3RlIGVzdHVkaW8gYSBuaXZlbCBkZSByb2J1c3RleiwgZWZpY2llbmNpYSBlIGludGVncmFjacOzbiBxdWUgUiwgUlN0dWRpbyB5IFJNYXJrZG93biBvZnJlY2VuIGFsIHVzdWFyaW8gcGFyYSBxdWUgZXN0ZSBzZSBwdWVkYSBlbmZvY2FyIGVuIMOpbCBzaW4gcGFzYXIgbWF5b3JlcyBpbmNvbnZlbmllbnRlcyBjb24gZWwgc29wb3J0ZSBkb2N1bWVudGFsIHBhcmEgcHJlc2VudGFybG8uDQoNCiMjICoqUmVmZXJlbmNpYXMqKg==